home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1995 June / MacFormat 25.iso / Shareware City / Developers / OutOfPhase1.1 Source / OutOfPhase Folder / NoteObject.c < prev    next >
Text File  |  1995-01-06  |  166KB  |  4,294 lines

  1. /* NoteObject.c */
  2. /*****************************************************************************/
  3. /*                                                                           */
  4. /*    Out Of Phase:  Digital Music Synthesis on General Purpose Computers    */
  5. /*    Copyright (C) 1994  Thomas R. Lawrence                                 */
  6. /*                                                                           */
  7. /*    This program is free software; you can redistribute it and/or modify   */
  8. /*    it under the terms of the GNU General Public License as published by   */
  9. /*    the Free Software Foundation; either version 2 of the License, or      */
  10. /*    (at your option) any later version.                                    */
  11. /*                                                                           */
  12. /*    This program is distributed in the hope that it will be useful,        */
  13. /*    but WITHOUT ANY WARRANTY; without even the implied warranty of         */
  14. /*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          */
  15. /*    GNU General Public License for more details.                           */
  16. /*                                                                           */
  17. /*    You should have received a copy of the GNU General Public License      */
  18. /*    along with this program; if not, write to the Free Software            */
  19. /*    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.              */
  20. /*                                                                           */
  21. /*    Thomas R. Lawrence can be reached at tomlaw@world.std.com.             */
  22. /*                                                                           */
  23. /*****************************************************************************/
  24.  
  25. #include "MiscInfo.h"
  26. #include "Audit.h"
  27. #include "Debug.h"
  28. #include "Definitions.h"
  29.  
  30. #define ShowMe_NoteObjectRec
  31. #include "NoteObject.h"
  32. #include "Memory.h"
  33. #include "Fractions.h"
  34. #include "DrawCommand.h"
  35. #include "DataMunging.h"
  36. #include "Numbers.h"
  37. #include "Frequency.h"
  38. #include "BufferedFileInput.h"
  39. #include "BufferedFileOutput.h"
  40.  
  41.  
  42. /* create a new note with space for the specified number of parameters */
  43. NoteObjectRec*                NewNote(void)
  44.     {
  45.         NoteObjectRec*            Note;
  46.  
  47.         Note = (NoteObjectRec*)AllocPtrCanFail(sizeof(NoteObjectRec),"NoteObjectRec:Note");
  48.         if (Note == NIL)
  49.             {
  50.                 return NIL;
  51.             }
  52.         Note->Flags = /* duration unspecified*/ eRelease1FromDefault
  53.             | eRelease2FromDefault | ePitchDisplacementStartFromDefault
  54.             | eDetuningModeDefault | eDurationAdjustDefault;
  55.         Note->a.Note.Pitch = 0;
  56.         Note->a.Note.PortamentoDuration = 0;
  57.         Note->a.Note.EarlyLateAdjust = 0;
  58.         Note->a.Note.DurationAdjust = 0;
  59.         Note->a.Note.Tie = NIL;
  60.         Note->a.Note.ReleasePoint1 = 0;
  61.         Note->a.Note.ReleasePoint2 = 0;
  62.         Note->a.Note.OverallLoudnessAdjustment = Double2SmallBCD(1);
  63.         Note->a.Note.StereoPositionAdjustment = 0;
  64.         Note->a.Note.SurroundPositionAdjustment = 0;
  65.         Note->a.Note.Accent1 = 0;
  66.         Note->a.Note.Accent2 = 0;
  67.         Note->a.Note.Accent3 = 0;
  68.         Note->a.Note.Accent4 = 0;
  69.         Note->a.Note.MultisamplePitchAsIf = -1;
  70.         Note->a.Note.PitchDisplacementDepthAdjustment = Double2SmallBCD(1);
  71.         Note->a.Note.PitchDisplacementRateAdjustment = Double2SmallBCD(1);
  72.         Note->a.Note.PitchDisplacementStartPoint = 0;
  73.         Note->a.Note.HurryUpFactor = Double2SmallBCD(1);
  74.         Note->a.Note.Detuning = 0;
  75.         return Note;
  76.     }
  77.  
  78.  
  79. /* create a new command */
  80. NoteObjectRec*                NewCommand(void)
  81.     {
  82.         NoteObjectRec*            Note;
  83.  
  84.         Note = (NoteObjectRec*)AllocPtrCanFail(sizeof(NoteObjectRec),"NoteObjectRec:Command");
  85.         if (Note == NIL)
  86.             {
  87.              FailurePoint1:
  88.                 return NIL;
  89.             }
  90.         Note->a.Command.StringArgument = AllocPtrCanFail(0,"NoteObjectRec:Command:StringArg");
  91.         if (Note->a.Command.StringArgument == NIL)
  92.             {
  93.              FailurePoint2:
  94.                 ReleasePtr((char*)Note);
  95.                 goto FailurePoint1;
  96.             }
  97.         Note->a.Command.Argument1 = 0;
  98.         Note->a.Command.Argument2 = 0;
  99.         Note->a.Command.Argument3 = 0;
  100.         Note->Flags = eCommandFlag;
  101.         return Note;
  102.     }
  103.  
  104.  
  105. /* dispose of the note */
  106. void                                    DisposeNote(NoteObjectRec* Note)
  107.     {
  108.         CheckPtrExistence(Note);
  109.         if (IsItACommand(Note))
  110.             {
  111.                 ReleasePtr(Note->a.Command.StringArgument);
  112.             }
  113.         ReleasePtr((char*)Note);
  114.     }
  115.  
  116.  
  117. /* find out what type of thing it is */
  118. MyBoolean                            IsItACommand(NoteObjectRec* Note)
  119.     {
  120.         CheckPtrExistence(Note);
  121.         return ((Note->Flags & eCommandFlag) != 0);
  122.     }
  123.  
  124.  
  125. /* convert the duration of the note into a fraction.  the numbers are not reduced */
  126. /* with the aim of eliminating as much factoring as possible to reduce the number */
  127. /* of lengthy multiplies and divides. */
  128. void                                    GetNoteDurationFrac(NoteObjectRec* Note, struct FractionRec* Frac)
  129.     {
  130.         unsigned long                Temp;
  131.  
  132.         CheckPtrExistence(Note);
  133.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteDurationFrac called on command"));
  134.         /* the denominator factors represent the following: */
  135.         /* 64 for 1/64th note, 3*5*7 for divided notes, and 2 for 3/2 dotted notes */
  136.         Frac->Denominator = (64*3*5*7*2);
  137.         switch (Note->Flags & eDurationMask)
  138.             {
  139.                 default:
  140.                     EXECUTE(PRERR(ForceAbort,"GetNoteDurationFrac:  bad duration value"));
  141.                     break;
  142.                 case e64thNote:
  143.                     Frac->Integer = 0;
  144.                     Frac->Fraction = 1 * (64*3*5*7*2) / 64;
  145.                     break;
  146.                 case e32ndNote:
  147.                     Frac->Integer = 0;
  148.                     Frac->Fraction = 1 * (64*3*5*7*2) / 32;
  149.                     break;
  150.                 case e16thNote:
  151.                     Frac->Integer = 0;
  152.                     Frac->Fraction = 1 * (64*3*5*7*2) / 16;
  153.                     break;
  154.                 case e8thNote:
  155.                     Frac->Integer = 0;
  156.                     Frac->Fraction = 1 * (64*3*5*7*2) / 8;
  157.                     break;
  158.                 case e4thNote:
  159.                     Frac->Integer = 0;
  160.                     Frac->Fraction = 1 * (64*3*5*7*2) / 4;
  161.                     break;
  162.                 case e2ndNote:
  163.                     Frac->Integer = 0;
  164.                     Frac->Fraction = 1 * (64*3*5*7*2) / 2;
  165.                     break;
  166.                 case eWholeNote:
  167.                     Frac->Integer = 1;
  168.                     Frac->Fraction = 0;
  169.                     break;
  170.                 case eDoubleNote:
  171.                     Frac->Integer = 2;
  172.                     Frac->Fraction = 0;
  173.                     break;
  174.                 case eQuadNote:
  175.                     Frac->Integer = 4;
  176.                     Frac->Fraction = 0;
  177.                     break;
  178.             }
  179.         if ((Note->Flags & eDotModifier) != 0)
  180.             {
  181.                 /* since the denominator is (64*3*5*7*2), with a 2 in it, we only have */
  182.                 /* to multiply note by 3/2 */
  183.                 Temp = (3 * (Frac->Fraction + Frac->Integer * (64*3*5*7*2))) / 2;
  184.                 Frac->Integer = Temp / (64*3*5*7*2);
  185.                 Frac->Fraction = Temp % (64*3*5*7*2);
  186.             }
  187.         switch (Note->Flags & eDivisionMask)
  188.             {
  189.                 default:
  190.                     EXECUTE(PRERR(ForceAbort,"GetNoteDurationFrac:  bad division"));
  191.                     break;
  192.                 case eDiv1Modifier:
  193.                     break;
  194.                 case eDiv3Modifier:
  195.                     /* since the denominator is (64*3*5*7*2), with a 3 in it, we only have */
  196.                     /* to multiply note by 1/3 */
  197.                     Temp = (Frac->Fraction + Frac->Integer * (64*3*5*7*2)) / 3;
  198.                     Frac->Integer = Temp / (64*3*5*7*2);
  199.                     Frac->Fraction = Temp % (64*3*5*7*2);
  200.                     break;
  201.                 case eDiv5Modifier:
  202.                     /* since the denominator is (64*3*5*7*2), with a 5 in it, we only have */
  203.                     /* to multiply note by 1/5 */
  204.                     Temp = (Frac->Fraction + Frac->Integer * (64*3*5*7*2)) / 5;
  205.                     Frac->Integer = Temp / (64*3*5*7*2);
  206.                     Frac->Fraction = Temp % (64*3*5*7*2);
  207.                     break;
  208.                 case eDiv7Modifier:
  209.                     /* since the denominator is (64*3*5*7*2), with a 7 in it, we only have */
  210.                     /* to multiply note by 1/7 */
  211.                     Temp = (Frac->Fraction + Frac->Integer * (64*3*5*7*2)) / 7;
  212.                     Frac->Integer = Temp / (64*3*5*7*2);
  213.                     Frac->Fraction = Temp % (64*3*5*7*2);
  214.                     break;
  215.             }
  216.     }
  217.  
  218.  
  219. /* draw the command on the screen, or measure how many pixels wide the image will be */
  220. /* if it will draw, it assumes the clipping rectangle to be set up properly */
  221. OrdType                                DrawCommandOnScreen(WinType* Window, OrdType X, OrdType Y,
  222.                                                 FontType Font, FontSizeType FontSize, OrdType FontHeight,
  223.                                                 NoteObjectRec* Note, MyBoolean ActuallyDraw, MyBoolean GreyedOut)
  224.     {
  225.         char*                                Name;
  226.         CommandAddrMode            Params;
  227.         OrdType                            ReturnValue;
  228.  
  229.         CheckPtrExistence(Note);
  230.         ERROR(!IsItACommand(Note),PRERR(ForceAbort,"DrawCommandOnScreen:  not a command"));
  231.         /* find out what the command's name is */
  232.         Name = GetCommandName((NoteCommands)(Note->Flags & ~eCommandFlag));
  233.         /* figure out what needs to be drawn for the command */
  234.         Params = GetCommandAddressingMode((NoteCommands)(Note->Flags & ~eCommandFlag));
  235.         /* perform the actual drawing of the command */
  236.         switch (Params)
  237.             {
  238.                 default:
  239.                     EXECUTE(PRERR(ForceAbort,"DrawCommandOnScreen:  bad command addressing mode"));
  240.                     break;
  241.                 case eNoParameters:
  242.                     ReturnValue = DrawCommandNoParams(Window,X,Y,Font,FontSize,ActuallyDraw,
  243.                         GreyedOut,Name);
  244.                     break;
  245.                 case e1SmallExtParameter: /* <1xs> */
  246.                     ReturnValue = DrawCommand1Param(Window,X,Y,Font,FontSize,ActuallyDraw,
  247.                         GreyedOut,Name,SmallExtBCDToString(Note->a.Command.Argument1));
  248.                     break;
  249.                 case e2SmallExtParameters: /* <1xs> <2xs> */
  250.                     ReturnValue = DrawCommand2Params(Window,X,Y,Font,FontSize,ActuallyDraw,
  251.                         GreyedOut,Name,SmallExtBCDToString(Note->a.Command.Argument1),
  252.                         SmallExtBCDToString(Note->a.Command.Argument2));
  253.                     break;
  254.                 case e1LargeParameter: /* <1l> */
  255.                     ReturnValue = DrawCommand1Param(Window,X,Y,Font,FontSize,ActuallyDraw,
  256.                         GreyedOut,Name,LargeBCDToString(Note->a.Command.Argument1));
  257.                     break;
  258.                 case eFirstLargeSecondSmallExtParameters: /* <1l> <2xs> */
  259.                     ReturnValue = DrawCommand2Params(Window,X,Y,Font,FontSize,ActuallyDraw,
  260.                         GreyedOut,Name,LargeBCDToString(Note->a.Command.Argument1),
  261.                         SmallExtBCDToString(Note->a.Command.Argument2));
  262.                     break;
  263.                 case e1ParamReleaseOrigin: /* origin <1i> */
  264.                     ERROR((Note->a.Command.Argument1 != 0) && (Note->a.Command.Argument1 != -1),
  265.                         PRERR(ForceAbort,"DrawCommandOnScreen:  bad value in argument 1"));
  266.                     ReturnValue = DrawCommand1Param(Window,X,Y,Font,FontSize,ActuallyDraw,
  267.                         GreyedOut,Name,StringToBlockCopy((Note->a.Command.Argument1 >= 0)
  268.                         ? "From End" : "From Start"));
  269.                     break;
  270.                 case e1PitchDisplacementMode: /* hertz/steps <1i> */
  271.                     ERROR((Note->a.Command.Argument1 != 0) && (Note->a.Command.Argument1 != -1),
  272.                         PRERR(ForceAbort,"DrawCommandOnScreen:  bad value in argument 1"));
  273.                     ReturnValue = DrawCommand1Param(Window,X,Y,Font,FontSize,ActuallyDraw,
  274.                         GreyedOut,Name,StringToBlockCopy((Note->a.Command.Argument1 >= 0)
  275.                         ? "Half-Steps" : "Hertz"));
  276.                     break;
  277.                 case e2IntegerParameters: /* <1i> <2i> */
  278.                     ReturnValue = DrawCommand2Params(Window,X,Y,Font,FontSize,ActuallyDraw,
  279.                         GreyedOut,Name,IntegerToString(Note->a.Command.Argument1),
  280.                         IntegerToString(Note->a.Command.Argument2));
  281.                     break;
  282.                 case e1DurationAdjustMode: /* multiplicative/additive <1i> */
  283.                     ERROR((Note->a.Command.Argument1 != 0) && (Note->a.Command.Argument1 != -1),
  284.                         PRERR(ForceAbort,"DrawCommandOnScreen:  bad value in argument 1"));
  285.                     ReturnValue = DrawCommand1Param(Window,X,Y,Font,FontSize,ActuallyDraw,
  286.                         GreyedOut,Name,StringToBlockCopy((Note->a.Command.Argument1 >= 0)
  287.                         ? "Additive" : "Multiplicative"));
  288.                     break;
  289.                 case e1IntegerParameter: /* <1i> */
  290.                     ReturnValue = DrawCommand1Param(Window,X,Y,Font,FontSize,ActuallyDraw,
  291.                         GreyedOut,Name,IntegerToString(Note->a.Command.Argument1));
  292.                     break;
  293.                 case e1StringParameterWithLineFeeds: /* <string> */
  294.                     ReturnValue = DrawCommand1ParamWithLineFeeds(Window,X,Y,Font,FontSize,
  295.                         ActuallyDraw,GreyedOut,Name,CopyPtr(Note->a.Command.StringArgument));
  296.                     break;
  297.                 case e1TrackEffectsMode: /* enable/disable <1i> */
  298.                     ERROR((Note->a.Command.Argument1 != 0) && (Note->a.Command.Argument1 != -1),
  299.                         PRERR(ForceAbort,"DrawCommandOnScreen:  bad value in argument 1"));
  300.                     ReturnValue = DrawCommand1Param(Window,X,Y,Font,FontSize,ActuallyDraw,
  301.                         GreyedOut,Name,StringToBlockCopy((Note->a.Command.Argument1 >= 0)
  302.                         ? "Disable" : "Enable"));
  303.                     break;
  304.             }
  305.         /* report width of thing to caller */
  306.         return ReturnValue;
  307.     }
  308.  
  309.  
  310. /* get a static null terminated string literal containing the name of a command */
  311. char*                                    GetCommandName(NoteCommands Command)
  312.     {
  313.         char*                                Name;
  314.  
  315.         switch (Command)
  316.             {
  317.                 default:
  318.                     EXECUTE(PRERR(ForceAbort,"GetCommandName:  unknown command opcode"));
  319.                     break;
  320.                 case eCmdRestoreTempo:
  321.                     Name = "Restore Tempo";
  322.                     break;
  323.                 case eCmdSetTempo:
  324.                     Name = "Set Tempo";
  325.                     break;
  326.                 case eCmdIncTempo:
  327.                     Name = "Adjust Tempo";
  328.                     break;
  329.                 case eCmdSweepTempoAbs:
  330.                     Name = "Sweep Tempo Absolute";
  331.                     break;
  332.                 case eCmdSweepTempoRel:
  333.                     Name = "Sweep Tempo Relative";
  334.                     break;
  335.                 case eCmdRestoreStereoPosition:
  336.                     Name = "Restore Stereo Position";
  337.                     break;
  338.                 case eCmdSetStereoPosition:
  339.                     Name = "Set Stereo Position";
  340.                     break;
  341.                 case eCmdIncStereoPosition:
  342.                     Name = "Adjust Stereo Position";
  343.                     break;
  344.                 case eCmdSweepStereoAbs:
  345.                     Name = "Sweep Stereo Position Absolute";
  346.                     break;
  347.                 case eCmdSweepStereoRel:
  348.                     Name = "Sweep Stereo Position Relative";
  349.                     break;
  350.                 case eCmdRestoreVolume:
  351.                     Name = "Restore Volume";
  352.                     break;
  353.                 case eCmdRestoreSurroundPosition:
  354.                     Name = "Restore Surround Position";
  355.                     break;
  356.                 case eCmdSetSurroundPosition:
  357.                     Name = "Set Surround Position";
  358.                     break;
  359.                 case eCmdIncSurroundPosition:
  360.                     Name = "Adjust Surround Position";
  361.                     break;
  362.                 case eCmdSweepSurroundAbs:
  363.                     Name = "Sweep Surround Position Absolute";
  364.                     break;
  365.                 case eCmdSweepSurroundRel:
  366.                     Name = "Sweep Surround Position Relative";
  367.                     break;
  368.                 case eCmdSetVolume:
  369.                     Name = "Set Volume";
  370.                     break;
  371.                 case eCmdIncVolume:
  372.                     Name = "Adjust Volume";
  373.                     break;
  374.                 case eCmdSweepVolumeAbs:
  375.                     Name = "Sweep Volume Absolute";
  376.                     break;
  377.                 case eCmdSweepVolumeRel:
  378.                     Name = "Sweep Volume Relative";
  379.                     break;
  380.                 case eCmdRestoreReleasePoint1:
  381.                     Name = "Restore Release Point 1";
  382.                     break;
  383.                 case eCmdSetReleasePoint1:
  384.                     Name = "Set Release Point 1";
  385.                     break;
  386.                 case eCmdIncReleasePoint1:
  387.                     Name = "Adjust Release Point 1";
  388.                     break;
  389.                 case eCmdReleasePointOrigin1:
  390.                     Name = "Set Release Point 1 Origin";
  391.                     break;
  392.                 case eCmdSweepReleaseAbs1:
  393.                     Name = "Sweep Release Point 1 Absolute";
  394.                     break;
  395.                 case eCmdSweepReleaseRel1:
  396.                     Name = "Sweep Release Point 1 Relative";
  397.                     break;
  398.                 case eCmdRestoreReleasePoint2:
  399.                     Name = "Restore Release Point 2";
  400.                     break;
  401.                 case eCmdSetReleasePoint2:
  402.                     Name = "Set Release Point 2";
  403.                     break;
  404.                 case eCmdIncReleasePoint2:
  405.                     Name = "Adjust Release Point 2";
  406.                     break;
  407.                 case eCmdReleasePointOrigin2:
  408.                     Name = "Set Release Point 2 Origin";
  409.                     break;
  410.                 case eCmdSweepReleaseAbs2:
  411.                     Name = "Sweep Release Point 2 Absolute";
  412.                     break;
  413.                 case eCmdSweepReleaseRel2:
  414.                     Name = "Sweep Release Point 2 Relative";
  415.                     break;
  416.                 case eCmdRestoreAccent1:
  417.                     Name = "Restore Accent 1";
  418.                     break;
  419.                 case eCmdSetAccent1:
  420.                     Name = "Set Accent 1";
  421.                     break;
  422.                 case eCmdIncAccent1:
  423.                     Name = "Adjust Accent 1";
  424.                     break;
  425.                 case eCmdSweepAccentAbs1:
  426.                     Name = "Sweep Accent 1 Absolute";
  427.                     break;
  428.                 case eCmdSweepAccentRel1:
  429.                     Name = "Sweep Accent 1 Relative";
  430.                     break;
  431.                 case eCmdRestoreAccent2:
  432.                     Name = "Restore Accent 2";
  433.                     break;
  434.                 case eCmdSetAccent2:
  435.                     Name = "Set Accent 2";
  436.                     break;
  437.                 case eCmdIncAccent2:
  438.                     Name = "Adjust Accent 2";
  439.                     break;
  440.                 case eCmdSweepAccentAbs2:
  441.                     Name = "Sweep Accent 2 Absolute";
  442.                     break;
  443.                 case eCmdSweepAccentRel2:
  444.                     Name = "Sweep Accent 2 Relative";
  445.                     break;
  446.                 case eCmdRestoreAccent3:
  447.                     Name = "Restore Accent 3";
  448.                     break;
  449.                 case eCmdSetAccent3:
  450.                     Name = "Set Accent 3";
  451.                     break;
  452.                 case eCmdIncAccent3:
  453.                     Name = "Adjust Accent 3";
  454.                     break;
  455.                 case eCmdSweepAccentAbs3:
  456.                     Name = "Sweep Accent 3 Absolute";
  457.                     break;
  458.                 case eCmdSweepAccentRel3:
  459.                     Name = "Sweep Accent 3 Relative";
  460.                     break;
  461.                 case eCmdRestoreAccent4:
  462.                     Name = "Restore Accent 4";
  463.                     break;
  464.                 case eCmdSetAccent4:
  465.                     Name = "Set Accent 4";
  466.                     break;
  467.                 case eCmdIncAccent4:
  468.                     Name = "Adjust Accent 4";
  469.                     break;
  470.                 case eCmdSweepAccentAbs4:
  471.                     Name = "Sweep Accent 4 Absolute";
  472.                     break;
  473.                 case eCmdSweepAccentRel4:
  474.                     Name = "Sweep Accent 4 Relative";
  475.                     break;
  476.                 case eCmdRestorePitchDispDepth:
  477.                     Name = "Restore Pitch Displacement Depth";
  478.                     break;
  479.                 case eCmdSetPitchDispDepth:
  480.                     Name = "Set Pitch Displacement Depth";
  481.                     break;
  482.                 case eCmdIncPitchDispDepth:
  483.                     Name = "Adjust Pitch Displacement Depth";
  484.                     break;
  485.                 case eCmdSweepPitchDispDepthAbs:
  486.                     Name = "Sweep Pitch Displacement Depth Absolute";
  487.                     break;
  488.                 case eCmdSweepPitchDispDepthRel:
  489.                     Name = "Sweep Pitch Displacement Depth Relative";
  490.                     break;
  491.                 case eCmdRestorePitchDispRate:
  492.                     Name = "Restore Pitch Displacement Rate";
  493.                     break;
  494.                 case eCmdSetPitchDispRate:
  495.                     Name = "Set Pitch Displacement Rate";
  496.                     break;
  497.                 case eCmdIncPitchDispRate:
  498.                     Name = "Adjust Pitch Displacement Rate";
  499.                     break;
  500.                 case eCmdSweepPitchDispRateAbs:
  501.                     Name = "Sweep Pitch Displacement Rate Absolute";
  502.                     break;
  503.                 case eCmdSweepPitchDispRateRel:
  504.                     Name = "Sweep Pitch Displacement Rate Relative";
  505.                     break;
  506.                 case eCmdRestorePitchDispStart:
  507.                     Name = "Restore Pitch Displacement Start Point";
  508.                     break;
  509.                 case eCmdSetPitchDispStart:
  510.                     Name = "Set Pitch Displacement Start Point";
  511.                     break;
  512.                 case eCmdIncPitchDispStart:
  513.                     Name = "Adjust Pitch Displacement Start Point";
  514.                     break;
  515.                 case eCmdPitchDispStartOrigin:
  516.                     Name = "Set Pitch Displacement Start Point Origin";
  517.                     break;
  518.                 case eCmdSweepPitchDispStartAbs:
  519.                     Name = "Sweep Pitch Displacement Start Point Absolute";
  520.                     break;
  521.                 case eCmdSweepPitchDispStartRel:
  522.                     Name = "Sweep Pitch Displacement Start Point Relative";
  523.                     break;
  524.                 case eCmdRestoreHurryUp:
  525.                     Name = "Restore Hurry-Up";
  526.                     break;
  527.                 case eCmdSetHurryUp:
  528.                     Name = "Set Hurry-Up";
  529.                     break;
  530.                 case eCmdIncHurryUp:
  531.                     Name = "Adjust Hurry-Up";
  532.                     break;
  533.                 case eCmdSweepHurryUpAbs:
  534.                     Name = "Sweep Hurry-Up Absolute";
  535.                     break;
  536.                 case eCmdSweepHurryUpRel:
  537.                     Name = "Sweep Hurry-Up Relative";
  538.                     break;
  539.                 case eCmdRestoreDetune:
  540.                     Name = "Restore Detuning";
  541.                     break;
  542.                 case eCmdSetDetune:
  543.                     Name = "Set Detuning";
  544.                     break;
  545.                 case eCmdIncDetune:
  546.                     Name = "Adjust Detuning";
  547.                     break;
  548.                 case eCmdDetuneMode:
  549.                     Name = "Set Detuning Mode";
  550.                     break;
  551.                 case eCmdSweepDetuneAbs:
  552.                     Name = "Sweep Detuning Absolute";
  553.                     break;
  554.                 case eCmdSweepDetuneRel:
  555.                     Name = "Sweep Detuning Relative";
  556.                     break;
  557.                 case eCmdRestoreEarlyLateAdjust:
  558.                     Name = "Restore Hit Time";
  559.                     break;
  560.                 case eCmdSetEarlyLateAdjust:
  561.                     Name = "Set Hit Time";
  562.                     break;
  563.                 case eCmdIncEarlyLateAdjust:
  564.                     Name = "Adjust Hit Time";
  565.                     break;
  566.                 case eCmdSweepEarlyLateAbs:
  567.                     Name = "Sweep Hit Time Absolute";
  568.                     break;
  569.                 case eCmdSweepEarlyLateRel:
  570.                     Name = "Sweep Hit Time Relative";
  571.                     break;
  572.                 case eCmdRestoreDurationAdjust:
  573.                     Name = "Restore Duration";
  574.                     break;
  575.                 case eCmdSetDurationAdjust:
  576.                     Name = "Set Duration";
  577.                     break;
  578.                 case eCmdIncDurationAdjust:
  579.                     Name = "Adjust Duration";
  580.                     break;
  581.                 case eCmdSweepDurationAbs:
  582.                     Name = "Sweep Duration Absolute";
  583.                     break;
  584.                 case eCmdSweepDurationRel:
  585.                     Name = "Sweep Duration Relative";
  586.                     break;
  587.                 case eCmdDurationAdjustMode:
  588.                     Name = "Set Duration Mode";
  589.                     break;
  590.                 case eCmdSetMeter:
  591.                     Name = "Set Meter";
  592.                     break;
  593.                 case eCmdSetMeasureNumber:
  594.                     Name = "Set Measure Number";
  595.                     break;
  596.                 case eCmdSetTranspose:
  597.                     Name = "Set Transpose";
  598.                     break;
  599.                 case eCmdAdjustTranspose:
  600.                     Name = "Adjust Transpose";
  601.                     break;
  602.                 case eCmdSetEffectParam1:
  603.                     Name = "Set Effect Accent 1";
  604.                     break;
  605.                 case eCmdIncEffectParam1:
  606.                     Name = "Adjust Effect Accent 1";
  607.                     break;
  608.                 case eCmdSweepEffectParamAbs1:
  609.                     Name = "Sweep Effect Accent 1 Absolute";
  610.                     break;
  611.                 case eCmdSweepEffectParamRel1:
  612.                     Name = "Sweep Effect Accent 1 Relative";
  613.                     break;
  614.                 case eCmdSetEffectParam2:
  615.                     Name = "Set Effect Accent 2";
  616.                     break;
  617.                 case eCmdIncEffectParam2:
  618.                     Name = "Adjust Effect Accent 2";
  619.                     break;
  620.                 case eCmdSweepEffectParamAbs2:
  621.                     Name = "Sweep Effect Accent 2 Absolute";
  622.                     break;
  623.                 case eCmdSweepEffectParamRel2:
  624.                     Name = "Sweep Effect Accent 2 Relative";
  625.                     break;
  626.                 case eCmdSetEffectParam3:
  627.                     Name = "Set Effect Accent 3";
  628.                     break;
  629.                 case eCmdIncEffectParam3:
  630.                     Name = "Adjust Effect Accent 3";
  631.                     break;
  632.                 case eCmdSweepEffectParamAbs3:
  633.                     Name = "Sweep Effect Accent 3 Absolute";
  634.                     break;
  635.                 case eCmdSweepEffectParamRel3:
  636.                     Name = "Sweep Effect Accent 3 Relative";
  637.                     break;
  638.                 case eCmdSetEffectParam4:
  639.                     Name = "Set Effect Accent 4";
  640.                     break;
  641.                 case eCmdIncEffectParam4:
  642.                     Name = "Adjust Effect Accent 4";
  643.                     break;
  644.                 case eCmdSweepEffectParamAbs4:
  645.                     Name = "Sweep Effect Accent 4 Absolute";
  646.                     break;
  647.                 case eCmdSweepEffectParamRel4:
  648.                     Name = "Sweep Effect Accent 4 Relative";
  649.                     break;
  650.                 case eCmdTrackEffectEnable:
  651.                     Name = "Track Effect Switch";
  652.                     break;
  653.                 case eCmdSetScoreEffectParam1:
  654.                     Name = "Set Global Score Effect Accent 1";
  655.                     break;
  656.                 case eCmdIncScoreEffectParam1:
  657.                     Name = "Adjust Global Score Effect Accent 1";
  658.                     break;
  659.                 case eCmdSweepScoreEffectParamAbs1:
  660.                     Name = "Sweep Global Score Effect Accent 1 Absolute";
  661.                     break;
  662.                 case eCmdSweepScoreEffectParamRel1:
  663.                     Name = "Sweep Global Score Effect Accent 1 Relative";
  664.                     break;
  665.                 case eCmdSetScoreEffectParam2:
  666.                     Name = "Set Global Score Effect Accent 2";
  667.                     break;
  668.                 case eCmdIncScoreEffectParam2:
  669.                     Name = "Adjust Global Score Effect Accent 2";
  670.                     break;
  671.                 case eCmdSweepScoreEffectParamAbs2:
  672.                     Name = "Sweep Global Score Effect Accent 2 Absolute";
  673.                     break;
  674.                 case eCmdSweepScoreEffectParamRel2:
  675.                     Name = "Sweep Global Score Effect Accent 2 Relative";
  676.                     break;
  677.                 case eCmdSetScoreEffectParam3:
  678.                     Name = "Set Global Score Effect Accent 3";
  679.                     break;
  680.                 case eCmdIncScoreEffectParam3:
  681.                     Name = "Adjust Global Score Effect Accent 3";
  682.                     break;
  683.                 case eCmdSweepScoreEffectParamAbs3:
  684.                     Name = "Sweep Global Score Effect Accent 3 Absolute";
  685.                     break;
  686.                 case eCmdSweepScoreEffectParamRel3:
  687.                     Name = "Sweep Global Score Effect Accent 3 Relative";
  688.                     break;
  689.                 case eCmdSetScoreEffectParam4:
  690.                     Name = "Set Global Score Effect Accent 4";
  691.                     break;
  692.                 case eCmdIncScoreEffectParam4:
  693.                     Name = "Adjust Global Score Effect Accent 4";
  694.                     break;
  695.                 case eCmdSweepScoreEffectParamAbs4:
  696.                     Name = "Sweep Global Score Effect Accent 4 Absolute";
  697.                     break;
  698.                 case eCmdSweepScoreEffectParamRel4:
  699.                     Name = "Sweep Global Score Effect Accent 4 Relative";
  700.                     break;
  701.                 case eCmdMarker:
  702.                     Name = "Marker";
  703.                     break;
  704.             }
  705.         return Name;
  706.     }
  707.  
  708.  
  709. /* get the addressing mode for a command */
  710. CommandAddrMode                GetCommandAddressingMode(NoteCommands Command)
  711.     {
  712.         CommandAddrMode            Params;
  713.  
  714.         switch (Command)
  715.             {
  716.                 default:
  717.                     EXECUTE(PRERR(ForceAbort,"GetCommandAddressingMode:  unknown command opcode"));
  718.                     break;
  719.                 case eCmdRestoreTempo: /* no parameters */
  720.                     Params = eNoParameters;
  721.                     break;
  722.                 case eCmdSetTempo: /* <1xs> */
  723.                     Params = e1SmallExtParameter;
  724.                     break;
  725.                 case eCmdIncTempo: /* <1xs> */
  726.                     Params = e1SmallExtParameter;
  727.                     break;
  728.                 case eCmdSweepTempoAbs: /* <1xs> <2xs> */
  729.                     Params = e2SmallExtParameters;
  730.                     break;
  731.                 case eCmdSweepTempoRel: /* <1xs> <2xs> */
  732.                     Params = e2SmallExtParameters;
  733.                     break;
  734.                 case eCmdRestoreStereoPosition: /* no parameters */
  735.                     Params = eNoParameters;
  736.                     break;
  737.                 case eCmdSetStereoPosition: /* <1l> */
  738.                     Params = e1LargeParameter;
  739.                     break;
  740.                 case eCmdIncStereoPosition: /* <1l> */
  741.                     Params = e1LargeParameter;
  742.                     break;
  743.                 case eCmdSweepStereoAbs: /* <1l> <2xs> */
  744.                     Params = eFirstLargeSecondSmallExtParameters;
  745.                     break;
  746.                 case eCmdSweepStereoRel: /* <1l> <2xs> */
  747.                     Params = eFirstLargeSecondSmallExtParameters;
  748.                     break;
  749.                 case eCmdRestoreSurroundPosition: /* no parameters */
  750.                     Params = eNoParameters;
  751.                     break;
  752.                 case eCmdSetSurroundPosition: /* <1l> */
  753.                     Params = e1LargeParameter;
  754.                     break;
  755.                 case eCmdIncSurroundPosition: /* <1l> */
  756.                     Params = e1LargeParameter;
  757.                     break;
  758.                 case eCmdSweepSurroundAbs: /* <1l> <2xs> */
  759.                     Params = eFirstLargeSecondSmallExtParameters;
  760.                     break;
  761.                 case eCmdSweepSurroundRel: /* <1l> <2xs> */
  762.                     Params = eFirstLargeSecondSmallExtParameters;
  763.                     break;
  764.                 case eCmdRestoreVolume: /* no parameters */
  765.                     Params = eNoParameters;
  766.                     break;
  767.                 case eCmdSetVolume: /* <1l> */
  768.                     Params = e1LargeParameter;
  769.                     break;
  770.                 case eCmdIncVolume: /* <1l> */
  771.                     Params = e1LargeParameter;
  772.                     break;
  773.                 case eCmdSweepVolumeAbs: /* <1l> <2xs> */
  774.                     Params = eFirstLargeSecondSmallExtParameters;
  775.                     break;
  776.                 case eCmdSweepVolumeRel: /* <1l> <2xs> */
  777.                     Params = eFirstLargeSecondSmallExtParameters;
  778.                     break;
  779.                 case eCmdRestoreReleasePoint1: /* no parameters */
  780.                     Params = eNoParameters;
  781.                     break;
  782.                 case eCmdSetReleasePoint1: /* <1l> */
  783.                     Params = e1LargeParameter;
  784.                     break;
  785.                 case eCmdIncReleasePoint1: /* <1l> */
  786.                     Params = e1LargeParameter;
  787.                     break;
  788.                 case eCmdReleasePointOrigin1: /* origin <1i> */
  789.                     Params = e1ParamReleaseOrigin;
  790.                     break;
  791.                 case eCmdSweepReleaseAbs1: /* <1l> <2xs> */
  792.                     Params = eFirstLargeSecondSmallExtParameters;
  793.                     break;
  794.                 case eCmdSweepReleaseRel1: /* <1l> <2xs> */
  795.                     Params = eFirstLargeSecondSmallExtParameters;
  796.                     break;
  797.                 case eCmdRestoreReleasePoint2: /* no parameters */
  798.                     Params = eNoParameters;
  799.                     break;
  800.                 case eCmdSetReleasePoint2: /* <1l> */
  801.                     Params = e1LargeParameter;
  802.                     break;
  803.                 case eCmdIncReleasePoint2: /* <1l> */
  804.                     Params = e1LargeParameter;
  805.                     break;
  806.                 case eCmdReleasePointOrigin2: /* origin <1i> */
  807.                     Params = e1ParamReleaseOrigin;
  808.                     break;
  809.                 case eCmdSweepReleaseAbs2: /* <1l> <2xs> */
  810.                     Params = eFirstLargeSecondSmallExtParameters;
  811.                     break;
  812.                 case eCmdSweepReleaseRel2: /* <1l> <2xs> */
  813.                     Params = eFirstLargeSecondSmallExtParameters;
  814.                     break;
  815.                 case eCmdRestoreAccent1: /* no parameters */
  816.                     Params = eNoParameters;
  817.                     break;
  818.                 case eCmdSetAccent1: /* <1l> */
  819.                     Params = e1LargeParameter;
  820.                     break;
  821.                 case eCmdIncAccent1: /* <1l> */
  822.                     Params = e1LargeParameter;
  823.                     break;
  824.                 case eCmdSweepAccentAbs1: /* <1l> <2xs> */
  825.                     Params = eFirstLargeSecondSmallExtParameters;
  826.                     break;
  827.                 case eCmdSweepAccentRel1: /* <1l> <2xs> */
  828.                     Params = eFirstLargeSecondSmallExtParameters;
  829.                     break;
  830.                 case eCmdRestoreAccent2: /* no parameters */
  831.                     Params = eNoParameters;
  832.                     break;
  833.                 case eCmdSetAccent2: /* <1l> */
  834.                     Params = e1LargeParameter;
  835.                     break;
  836.                 case eCmdIncAccent2: /* <1l> */
  837.                     Params = e1LargeParameter;
  838.                     break;
  839.                 case eCmdSweepAccentAbs2: /* <1l> <2xs> */
  840.                     Params = eFirstLargeSecondSmallExtParameters;
  841.                     break;
  842.                 case eCmdSweepAccentRel2: /* <1l> <2xs> */
  843.                     Params = eFirstLargeSecondSmallExtParameters;
  844.                     break;
  845.                 case eCmdRestoreAccent3: /* no parameters */
  846.                     Params = eNoParameters;
  847.                     break;
  848.                 case eCmdSetAccent3: /* <1l> */
  849.                     Params = e1LargeParameter;
  850.                     break;
  851.                 case eCmdIncAccent3: /* <1l> */
  852.                     Params = e1LargeParameter;
  853.                     break;
  854.                 case eCmdSweepAccentAbs3: /* <1l> <2xs> */
  855.                     Params = eFirstLargeSecondSmallExtParameters;
  856.                     break;
  857.                 case eCmdSweepAccentRel3: /* <1l> <2xs> */
  858.                     Params = eFirstLargeSecondSmallExtParameters;
  859.                     break;
  860.                 case eCmdRestoreAccent4: /* no parameters */
  861.                     Params = eNoParameters;
  862.                     break;
  863.                 case eCmdSetAccent4: /* <1l> */
  864.                     Params = e1LargeParameter;
  865.                     break;
  866.                 case eCmdIncAccent4: /* <1l> */
  867.                     Params = eFirstLargeSecondSmallExtParameters;
  868.                     break;
  869.                 case eCmdSweepAccentAbs4: /* <1l> <2xs> */
  870.                     Params = eFirstLargeSecondSmallExtParameters;
  871.                     break;
  872.                 case eCmdSweepAccentRel4: /* <1l> <2xs> */
  873.                     Params = eFirstLargeSecondSmallExtParameters;
  874.                     break;
  875.                 case eCmdRestorePitchDispDepth: /* no parameters */
  876.                     Params = eNoParameters;
  877.                     break;
  878.                 case eCmdSetPitchDispDepth: /* <1l> */
  879.                     Params = e1LargeParameter;
  880.                     break;
  881.                 case eCmdIncPitchDispDepth: /* <1l> */
  882.                     Params = e1LargeParameter;
  883.                     break;
  884.                 case eCmdSweepPitchDispDepthAbs: /* <1l> <2xs> */
  885.                     Params = eFirstLargeSecondSmallExtParameters;
  886.                     break;
  887.                 case eCmdSweepPitchDispDepthRel: /* <1l> <2xs> */
  888.                     Params = eFirstLargeSecondSmallExtParameters;
  889.                     break;
  890.                 case eCmdRestorePitchDispRate: /* no parameters */
  891.                     Params = eNoParameters;
  892.                     break;
  893.                 case eCmdSetPitchDispRate: /* <1l> */
  894.                     Params = e1LargeParameter;
  895.                     break;
  896.                 case eCmdIncPitchDispRate: /* <1l> */
  897.                     Params = e1LargeParameter;
  898.                     break;
  899.                 case eCmdSweepPitchDispRateAbs: /* <1l> <2xs> */
  900.                     Params = eFirstLargeSecondSmallExtParameters;
  901.                     break;
  902.                 case eCmdSweepPitchDispRateRel: /* <1l> <2xs> */
  903.                     Params = eFirstLargeSecondSmallExtParameters;
  904.                     break;
  905.                 case eCmdRestorePitchDispStart: /* no parameters */
  906.                     Params = eNoParameters;
  907.                     break;
  908.                 case eCmdSetPitchDispStart: /* <1l> */
  909.                     Params = e1LargeParameter;
  910.                     break;
  911.                 case eCmdIncPitchDispStart: /* <1l> */
  912.                     Params = e1LargeParameter;
  913.                     break;
  914.                 case eCmdPitchDispStartOrigin: /* origin <1i> */
  915.                     Params = e1ParamReleaseOrigin;
  916.                     break;
  917.                 case eCmdSweepPitchDispStartAbs: /* <1l> <2xs> */
  918.                     Params = eFirstLargeSecondSmallExtParameters;
  919.                     break;
  920.                 case eCmdSweepPitchDispStartRel: /* <1l> <2xs> */
  921.                     Params = eFirstLargeSecondSmallExtParameters;
  922.                     break;
  923.                 case eCmdRestoreHurryUp: /* no parameters */
  924.                     Params = eNoParameters;
  925.                     break;
  926.                 case eCmdSetHurryUp: /* <1l> */
  927.                     Params = e1LargeParameter;
  928.                     break;
  929.                 case eCmdIncHurryUp: /* <1l> */
  930.                     Params = e1LargeParameter;
  931.                     break;
  932.                 case eCmdSweepHurryUpAbs: /* <1l> <2xs> */
  933.                     Params = eFirstLargeSecondSmallExtParameters;
  934.                     break;
  935.                 case eCmdSweepHurryUpRel: /* <1l> <2xs> */
  936.                     Params = eFirstLargeSecondSmallExtParameters;
  937.                     break;
  938.                 case eCmdRestoreDetune: /* no parameters */
  939.                     Params = eNoParameters;
  940.                     break;
  941.                 case eCmdSetDetune: /* <1l> */
  942.                     Params = e1LargeParameter;
  943.                     break;
  944.                 case eCmdIncDetune: /* <1l> */
  945.                     Params = e1LargeParameter;
  946.                     break;
  947.                 case eCmdDetuneMode: /* hertz/steps <1i> */
  948.                     Params = e1PitchDisplacementMode;
  949.                     break;
  950.                 case eCmdSweepDetuneAbs: /* <1l> <2xs> */
  951.                     Params = eFirstLargeSecondSmallExtParameters;
  952.                     break;
  953.                 case eCmdSweepDetuneRel: /* <1l> <2xs> */
  954.                     Params = eFirstLargeSecondSmallExtParameters;
  955.                     break;
  956.                 case eCmdRestoreEarlyLateAdjust: /* no parameters */
  957.                     Params = eNoParameters;
  958.                     break;
  959.                 case eCmdSetEarlyLateAdjust: /* <1l> */
  960.                     Params = e1LargeParameter;
  961.                     break;
  962.                 case eCmdIncEarlyLateAdjust: /* <1l> */
  963.                     Params = e1LargeParameter;
  964.                     break;
  965.                 case eCmdSweepEarlyLateAbs: /* <1l> <2xs> */
  966.                     Params = eFirstLargeSecondSmallExtParameters;
  967.                     break;
  968.                 case eCmdSweepEarlyLateRel: /* <1l> <2xs> */
  969.                     Params = eFirstLargeSecondSmallExtParameters;
  970.                     break;
  971.                 case eCmdRestoreDurationAdjust: /* no parameters */
  972.                     Params = eNoParameters;
  973.                     break;
  974.                 case eCmdSetDurationAdjust: /* <1l> */
  975.                     Params = e1LargeParameter;
  976.                     break;
  977.                 case eCmdIncDurationAdjust: /* <1l> */
  978.                     Params = e1LargeParameter;
  979.                     break;
  980.                 case eCmdSweepDurationAbs: /* <1l> <2xs> */
  981.                     Params = eFirstLargeSecondSmallExtParameters;
  982.                     break;
  983.                 case eCmdSweepDurationRel: /* <1l> <2xs> */
  984.                     Params = eFirstLargeSecondSmallExtParameters;
  985.                     break;
  986.                 case eCmdDurationAdjustMode: /* multiplicative/additive <1i> */
  987.                     Params = e1DurationAdjustMode;
  988.                     break;
  989.                 case eCmdSetMeter: /* <1i> <2i> */
  990.                     Params = e2IntegerParameters;
  991.                     break;
  992.                 case eCmdSetMeasureNumber: /* <1i> */
  993.                     Params = e1IntegerParameter;
  994.                     break;
  995.                 case eCmdSetTranspose: /* <1i> */
  996.                     Params = e1IntegerParameter;
  997.                     break;
  998.                 case eCmdAdjustTranspose: /* <1i> */
  999.                     Params = e1IntegerParameter;
  1000.                     break;
  1001.                 case eCmdSetEffectParam1: /* <1l> */
  1002.                     Params = e1LargeParameter;
  1003.                     break;
  1004.                 case eCmdIncEffectParam1: /* <1l> */
  1005.                     Params = e1LargeParameter;
  1006.                     break;
  1007.                 case eCmdSweepEffectParamAbs1: /* <1l> <2xs> */
  1008.                     Params = eFirstLargeSecondSmallExtParameters;
  1009.                     break;
  1010.                 case eCmdSweepEffectParamRel1: /* <1l> <2xs> */
  1011.                     Params = eFirstLargeSecondSmallExtParameters;
  1012.                     break;
  1013.                 case eCmdSetEffectParam2: /* <1l> */
  1014.                     Params = e1LargeParameter;
  1015.                     break;
  1016.                 case eCmdIncEffectParam2: /* <1l> */
  1017.                     Params = e1LargeParameter;
  1018.                     break;
  1019.                 case eCmdSweepEffectParamAbs2: /* <1l> <2xs> */
  1020.                     Params = eFirstLargeSecondSmallExtParameters;
  1021.                     break;
  1022.                 case eCmdSweepEffectParamRel2: /* <1l> <2xs> */
  1023.                     Params = eFirstLargeSecondSmallExtParameters;
  1024.                     break;
  1025.                 case eCmdSetEffectParam3: /* <1l> */
  1026.                     Params = e1LargeParameter;
  1027.                     break;
  1028.                 case eCmdIncEffectParam3: /* <1l> */
  1029.                     Params = e1LargeParameter;
  1030.                     break;
  1031.                 case eCmdSweepEffectParamAbs3: /* <1l> <2xs> */
  1032.                     Params = eFirstLargeSecondSmallExtParameters;
  1033.                     break;
  1034.                 case eCmdSweepEffectParamRel3: /* <1l> <2xs> */
  1035.                     Params = eFirstLargeSecondSmallExtParameters;
  1036.                     break;
  1037.                 case eCmdSetEffectParam4: /* <1l> */
  1038.                     Params = e1LargeParameter;
  1039.                     break;
  1040.                 case eCmdIncEffectParam4: /* <1l> */
  1041.                     Params = e1LargeParameter;
  1042.                     break;
  1043.                 case eCmdSweepEffectParamAbs4: /* <1l> <2xs> */
  1044.                     Params = eFirstLargeSecondSmallExtParameters;
  1045.                     break;
  1046.                 case eCmdSweepEffectParamRel4: /* <1l> <2xs> */
  1047.                     Params = eFirstLargeSecondSmallExtParameters;
  1048.                     break;
  1049.                 case eCmdTrackEffectEnable: /* enable/disable <1i> */
  1050.                     Params = e1TrackEffectsMode;
  1051.                     break;
  1052.                 case eCmdSetScoreEffectParam1: /* <1l> */
  1053.                     Params = e1LargeParameter;
  1054.                     break;
  1055.                 case eCmdIncScoreEffectParam1: /* <1l> */
  1056.                     Params = e1LargeParameter;
  1057.                     break;
  1058.                 case eCmdSweepScoreEffectParamAbs1: /* <1l> <2xs> */
  1059.                     Params = eFirstLargeSecondSmallExtParameters;
  1060.                     break;
  1061.                 case eCmdSweepScoreEffectParamRel1: /* <1l> <2xs> */
  1062.                     Params = eFirstLargeSecondSmallExtParameters;
  1063.                     break;
  1064.                 case eCmdSetScoreEffectParam2: /* <1l> */
  1065.                     Params = e1LargeParameter;
  1066.                     break;
  1067.                 case eCmdIncScoreEffectParam2: /* <1l> */
  1068.                     Params = e1LargeParameter;
  1069.                     break;
  1070.                 case eCmdSweepScoreEffectParamAbs2: /* <1l> <2xs> */
  1071.                     Params = eFirstLargeSecondSmallExtParameters;
  1072.                     break;
  1073.                 case eCmdSweepScoreEffectParamRel2: /* <1l> <2xs> */
  1074.                     Params = eFirstLargeSecondSmallExtParameters;
  1075.                     break;
  1076.                 case eCmdSetScoreEffectParam3: /* <1l> */
  1077.                     Params = e1LargeParameter;
  1078.                     break;
  1079.                 case eCmdIncScoreEffectParam3: /* <1l> */
  1080.                     Params = e1LargeParameter;
  1081.                     break;
  1082.                 case eCmdSweepScoreEffectParamAbs3: /* <1l> <2xs> */
  1083.                     Params = eFirstLargeSecondSmallExtParameters;
  1084.                     break;
  1085.                 case eCmdSweepScoreEffectParamRel3: /* <1l> <2xs> */
  1086.                     Params = eFirstLargeSecondSmallExtParameters;
  1087.                     break;
  1088.                 case eCmdSetScoreEffectParam4: /* <1l> */
  1089.                     Params = e1LargeParameter;
  1090.                     break;
  1091.                 case eCmdIncScoreEffectParam4: /* <1l> */
  1092.                     Params = e1LargeParameter;
  1093.                     break;
  1094.                 case eCmdSweepScoreEffectParamAbs4: /* <1l> <2xs> */
  1095.                     Params = eFirstLargeSecondSmallExtParameters;
  1096.                     break;
  1097.                 case eCmdSweepScoreEffectParamRel4: /* <1l> <2xs> */
  1098.                     Params = eFirstLargeSecondSmallExtParameters;
  1099.                     break;
  1100.                 case eCmdMarker: /* <string> */
  1101.                     Params = e1StringParameterWithLineFeeds;
  1102.                     break;
  1103.             }
  1104.         return Params;
  1105.     }
  1106.  
  1107.  
  1108. /* get the actual string argument contained in a command. NIL == not defined yet */
  1109. char*                                    GetCommandStringArg(NoteObjectRec* Command)
  1110.     {
  1111.         CheckPtrExistence(Command);
  1112.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,
  1113.             "GetCommandStringArg:  called on note"));
  1114.         return Command->a.Command.StringArgument;
  1115.     }
  1116.  
  1117.  
  1118. /* get the first numeric argument contained in a command */
  1119. long                                    GetCommandNumericArg1(NoteObjectRec* Command)
  1120.     {
  1121.         CheckPtrExistence(Command);
  1122.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,
  1123.             "GetCommandNumericArg1:  called on note"));
  1124.         return Command->a.Command.Argument1;
  1125.     }
  1126.  
  1127.  
  1128. /* get the second numeric argument contained in a command */
  1129. long                                    GetCommandNumericArg2(NoteObjectRec* Command)
  1130.     {
  1131.         CheckPtrExistence(Command);
  1132.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,
  1133.             "GetCommandNumericArg2:  called on note"));
  1134.         return Command->a.Command.Argument2;
  1135.     }
  1136.  
  1137.  
  1138. /* get the third numeric argument contained in a command */
  1139. long                                    GetCommandNumericArg3(NoteObjectRec* Command)
  1140.     {
  1141.         CheckPtrExistence(Command);
  1142.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,
  1143.             "GetCommandNumericArg3:  called on note"));
  1144.         return Command->a.Command.Argument3;
  1145.     }
  1146.  
  1147.  
  1148. /* put a new string into the command.  the command becomes owner of the string. */
  1149. void                                    PutCommandStringArg(NoteObjectRec* Command, char* NewArg)
  1150.     {
  1151.         CheckPtrExistence(Command);
  1152.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,
  1153.             "PutCommandStringArg:  called on note"));
  1154.         CheckPtrExistence(NewArg);
  1155.         ReleasePtr(Command->a.Command.StringArgument);
  1156.         Command->a.Command.StringArgument = NewArg;
  1157.     }
  1158.  
  1159.  
  1160. /* put a new first numeric argument into the command */
  1161. void                                    PutCommandNumericArg1(NoteObjectRec* Command, long NewValue)
  1162.     {
  1163.         CheckPtrExistence(Command);
  1164.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,
  1165.             "PutCommandNumericArg1:  called on note"));
  1166.         Command->a.Command.Argument1 = NewValue;
  1167.     }
  1168.  
  1169.  
  1170. /* put a new second numeric argument into the command */
  1171. void                                    PutCommandNumericArg2(NoteObjectRec* Command, long NewValue)
  1172.     {
  1173.         CheckPtrExistence(Command);
  1174.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,
  1175.             "PutCommandNumericArg2:  called on note"));
  1176.         Command->a.Command.Argument2 = NewValue;
  1177.     }
  1178.  
  1179.  
  1180. /* put a new third numeric argument into the command */
  1181. void                                    PutCommandNumericArg3(NoteObjectRec* Command, long NewValue)
  1182.     {
  1183.         CheckPtrExistence(Command);
  1184.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,
  1185.             "PutCommandNumericArg3:  called on note"));
  1186.         Command->a.Command.Argument3 = NewValue;
  1187.     }
  1188.  
  1189.  
  1190. /* get the pitch of a note */
  1191. short                                    GetNotePitch(NoteObjectRec* Note)
  1192.     {
  1193.         CheckPtrExistence(Note);
  1194.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNotePitch:  called on command"));
  1195.         return Note->a.Note.Pitch;
  1196.     }
  1197.  
  1198.  
  1199. /* get the portamento transition time for the note */
  1200. double                                GetNotePortamentoDuration(NoteObjectRec* Note)
  1201.     {
  1202.         CheckPtrExistence(Note);
  1203.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1204.             "GetNotePortamentoDuration:  called on command"));
  1205.         return SmallBCD2Double(Note->a.Note.PortamentoDuration);
  1206.     }
  1207.  
  1208.  
  1209. /* get the early/late adjustment factor for a note */
  1210. double                                GetNoteEarlyLateAdjust(NoteObjectRec* Note)
  1211.     {
  1212.         CheckPtrExistence(Note);
  1213.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1214.             "GetNoteEarlyLateAdjust:  called on command"));
  1215.         return SmallBCD2Double(Note->a.Note.EarlyLateAdjust);
  1216.     }
  1217.  
  1218.  
  1219. /* get the duration adjust value for a note */
  1220. double                                GetNoteDurationAdjust(NoteObjectRec* Note)
  1221.     {
  1222.         CheckPtrExistence(Note);
  1223.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1224.             "GetNoteDurationAdjust:  called on command"));
  1225.         return SmallBCD2Double(Note->a.Note.DurationAdjust);
  1226.     }
  1227.  
  1228.  
  1229. /* get a pointer to the note that this note ties to or NIL if there is no tie */
  1230. NoteObjectRec*                GetNoteTieTarget(NoteObjectRec* Note)
  1231.     {
  1232.         CheckPtrExistence(Note);
  1233.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteTieTarget:  called on command"));
  1234.         if (Note->a.Note.Tie != NIL)
  1235.             {
  1236.                 CheckPtrExistence(Note->a.Note.Tie);
  1237.             }
  1238.         return Note->a.Note.Tie;
  1239.     }
  1240.  
  1241.  
  1242. /* get the first release point position from a note */
  1243. double                                GetNoteReleasePoint1(NoteObjectRec* Note)
  1244.     {
  1245.         CheckPtrExistence(Note);
  1246.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1247.             "GetNoteReleasePoint1:  called on command"));
  1248.         return SmallBCD2Double(Note->a.Note.ReleasePoint1);
  1249.     }
  1250.  
  1251.  
  1252. /* get the second release point position from a note */
  1253. double                                GetNoteReleasePoint2(NoteObjectRec* Note)
  1254.     {
  1255.         CheckPtrExistence(Note);
  1256.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1257.             "GetNoteReleasePoint2:  called on command"));
  1258.         return SmallBCD2Double(Note->a.Note.ReleasePoint2);
  1259.     }
  1260.  
  1261.  
  1262. /* get the overall loudness factor for the note */
  1263. double                                GetNoteOverallLoudnessAdjustment(NoteObjectRec* Note)
  1264.     {
  1265.         CheckPtrExistence(Note);
  1266.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1267.             "GetNoteOverallLoudnessAdjustment:  called on command"));
  1268.         return SmallBCD2Double(Note->a.Note.OverallLoudnessAdjustment);
  1269.     }
  1270.  
  1271.  
  1272. /* get the stereo positioning for the note */
  1273. double                                GetNoteStereoPositioning(NoteObjectRec* Note)
  1274.     {
  1275.         CheckPtrExistence(Note);
  1276.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1277.             "GetNoteStereoPositioning:  called on command"));
  1278.         return SmallBCD2Double(Note->a.Note.StereoPositionAdjustment);
  1279.     }
  1280.  
  1281.  
  1282. /* get the surround positioning for the note */
  1283. double                                GetNoteSurroundPositioning(NoteObjectRec* Note)
  1284.     {
  1285.         CheckPtrExistence(Note);
  1286.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1287.             "GetNoteSurroundPositioning:  called on command"));
  1288.         return SmallBCD2Double(Note->a.Note.SurroundPositionAdjustment);
  1289.     }
  1290.  
  1291.  
  1292. /* get the first accent factor for the note */
  1293. double                                GetNoteAccent1(NoteObjectRec* Note)
  1294.     {
  1295.         CheckPtrExistence(Note);
  1296.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteAccent1:  called on command"));
  1297.         return SmallBCD2Double(Note->a.Note.Accent1);
  1298.     }
  1299.  
  1300.  
  1301. /* get the second accent factor for the note */
  1302. double                                GetNoteAccent2(NoteObjectRec* Note)
  1303.     {
  1304.         CheckPtrExistence(Note);
  1305.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteAccent2:  called on command"));
  1306.         return SmallBCD2Double(Note->a.Note.Accent2);
  1307.     }
  1308.  
  1309.  
  1310. /* get the third accent factor for the note */
  1311. double                                GetNoteAccent3(NoteObjectRec* Note)
  1312.     {
  1313.         CheckPtrExistence(Note);
  1314.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteAccent3:  called on command"));
  1315.         return SmallBCD2Double(Note->a.Note.Accent3);
  1316.     }
  1317.  
  1318.  
  1319. /* get the fourth accent factor for the note */
  1320. double                                GetNoteAccent4(NoteObjectRec* Note)
  1321.     {
  1322.         CheckPtrExistence(Note);
  1323.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteAccent4:  called on command"));
  1324.         return SmallBCD2Double(Note->a.Note.Accent4);
  1325.     }
  1326.  
  1327.  
  1328. /* get the pitch that the table selector should treat the note as using */
  1329. short                                    GetNoteMultisampleFalsePitch(NoteObjectRec* Note)
  1330.     {
  1331.         CheckPtrExistence(Note);
  1332.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1333.             "GetNoteMultisampleFalsePitch:  called on command"));
  1334.         return Note->a.Note.MultisamplePitchAsIf;
  1335.     }
  1336.  
  1337.  
  1338. /* get the pitch displacement depth adjust factor */
  1339. double                                GetNotePitchDisplacementDepthAdjust(NoteObjectRec* Note)
  1340.     {
  1341.         CheckPtrExistence(Note);
  1342.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1343.             "GetNotePitchDisplacementDepthAdjust:  called on command"));
  1344.         return SmallBCD2Double(Note->a.Note.PitchDisplacementDepthAdjustment);
  1345.     }
  1346.  
  1347.  
  1348. /* get the pitch displacement rate adjust factor for the note */
  1349. double                                GetNotePitchDisplacementRateAdjust(NoteObjectRec* Note)
  1350.     {
  1351.         CheckPtrExistence(Note);
  1352.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1353.             "GetNotePitchDisplacementRateAdjust:  called on command"));
  1354.         return SmallBCD2Double(Note->a.Note.PitchDisplacementRateAdjustment);
  1355.     }
  1356.  
  1357.  
  1358. /* get the pitch displacement envelope start point */
  1359. double                                GetNotePitchDisplacementStartPoint(NoteObjectRec* Note)
  1360.     {
  1361.         CheckPtrExistence(Note);
  1362.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1363.             "GetNotePitchDisplacementStartPoint:  called on command"));
  1364.         return SmallBCD2Double(Note->a.Note.PitchDisplacementStartPoint);
  1365.     }
  1366.  
  1367.  
  1368. /* get the hurryup factor for the note */
  1369. double                                GetNoteHurryUpFactor(NoteObjectRec* Note)
  1370.     {
  1371.         CheckPtrExistence(Note);
  1372.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1373.             "GetNoteHurryUpFactor:  called on command"));
  1374.         return SmallBCD2Double(Note->a.Note.HurryUpFactor);
  1375.     }
  1376.  
  1377.  
  1378. /* get the detuning adjustment for the note */
  1379. double                                GetNoteDetuning(NoteObjectRec* Note)
  1380.     {
  1381.         CheckPtrExistence(Note);
  1382.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteDetuning:  called on command"));
  1383.         return SmallBCD2Double(Note->a.Note.Detuning);
  1384.     }
  1385.  
  1386.  
  1387. /* change the pitch of a note */
  1388. void                                    PutNotePitch(NoteObjectRec* Note, short NewPitch)
  1389.     {
  1390.         CheckPtrExistence(Note);
  1391.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNotePitch:  called on command"));
  1392.         ERROR((NewPitch < 0) || (NewPitch >= NUMNOTES),PRERR(ForceAbort,
  1393.             "PutNotePitch:  pitch value is out of range"));
  1394.         Note->a.Note.Pitch = NewPitch;
  1395.     }
  1396.  
  1397.  
  1398. /* get the portamento transition time for the note */
  1399. void                                    PutNotePortamentoDuration(NoteObjectRec* Note,
  1400.                                                 double NewPortamentoDuration)
  1401.     {
  1402.         CheckPtrExistence(Note);
  1403.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1404.             "PutNotePortamentoDuration:  called on command"));
  1405.         Note->a.Note.PortamentoDuration = Double2SmallBCD(NewPortamentoDuration);
  1406.     }
  1407.  
  1408.  
  1409. /* change the early/late adjustment factor for a note */
  1410. void                                    PutNoteEarlyLateAdjust(NoteObjectRec* Note, double NewEarlyLate)
  1411.     {
  1412.         CheckPtrExistence(Note);
  1413.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1414.             "PutNoteEarlyLateAdjust:  called on command"));
  1415.         Note->a.Note.EarlyLateAdjust = Double2SmallBCD(NewEarlyLate);
  1416.     }
  1417.  
  1418.  
  1419. /* change the duration adjust value for a note */
  1420. void                                    PutNoteDurationAdjust(NoteObjectRec* Note,
  1421.                                                 double NewDurationAdjust)
  1422.     {
  1423.         CheckPtrExistence(Note);
  1424.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1425.             "PutNoteDurationAdjust:  called on command"));
  1426.         Note->a.Note.DurationAdjust = Double2SmallBCD(NewDurationAdjust);
  1427.     }
  1428.  
  1429.  
  1430. /* change the pointer to the note that this note ties to. */
  1431. void                                    PutNoteTieTarget(NoteObjectRec* Note, NoteObjectRec* NewTieTarget)
  1432.     {
  1433.         CheckPtrExistence(Note);
  1434.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteTieTarget:  called on command"));
  1435.         if (NewTieTarget != NIL)
  1436.             {
  1437.                 CheckPtrExistence(NewTieTarget);
  1438.             }
  1439.         Note->a.Note.Tie = NewTieTarget;
  1440.     }
  1441.  
  1442.  
  1443. /* change the first release point position from a note */
  1444. void                                    PutNoteReleasePoint1(NoteObjectRec* Note, double NewReleasePoint1)
  1445.     {
  1446.         CheckPtrExistence(Note);
  1447.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1448.             "PutNoteReleasePoint1:  called on command"));
  1449.         Note->a.Note.ReleasePoint1 = Double2SmallBCD(NewReleasePoint1);
  1450.     }
  1451.  
  1452.  
  1453. /* change the second release point position from a note */
  1454. void                                    PutNoteReleasePoint2(NoteObjectRec* Note, double NewReleasePoint2)
  1455.     {
  1456.         CheckPtrExistence(Note);
  1457.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1458.             "PutNoteReleasePoint2:  called on command"));
  1459.         Note->a.Note.ReleasePoint2 = Double2SmallBCD(NewReleasePoint2);
  1460.     }
  1461.  
  1462.  
  1463. /* change the overall loudness factor for the note */
  1464. void                                    PutNoteOverallLoudnessAdjustment(NoteObjectRec* Note,
  1465.                                                 double NewLoudnessAdjust)
  1466.     {
  1467.         CheckPtrExistence(Note);
  1468.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1469.             "PutNoteOverallLoudnessAdjustment:  called on command"));
  1470.         Note->a.Note.OverallLoudnessAdjustment = Double2SmallBCD(NewLoudnessAdjust);
  1471.     }
  1472.  
  1473.  
  1474. /* change the stereo positioning for the note */
  1475. void                                    PutNoteStereoPositioning(NoteObjectRec* Note,
  1476.                                                 double NewStereoPosition)
  1477.     {
  1478.         CheckPtrExistence(Note);
  1479.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1480.             "PutNoteStereoPositioning:  called on command"));
  1481.         Note->a.Note.StereoPositionAdjustment = Double2SmallBCD(NewStereoPosition);
  1482.     }
  1483.  
  1484.  
  1485. /* change the surround positioning for the note */
  1486. void                                    PutNoteSurroundPositioning(NoteObjectRec* Note,
  1487.                                                 double NewSurroundPosition)
  1488.     {
  1489.         CheckPtrExistence(Note);
  1490.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1491.             "PutNoteSurroundPositioning:  called on command"));
  1492.         Note->a.Note.SurroundPositionAdjustment = Double2SmallBCD(NewSurroundPosition);
  1493.     }
  1494.  
  1495.  
  1496. /* change the first accent factor for the note */
  1497. void                                    PutNoteAccent1(NoteObjectRec* Note, double NewAccent1)
  1498.     {
  1499.         CheckPtrExistence(Note);
  1500.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteAccent1:  called on command"));
  1501.         Note->a.Note.Accent1 = Double2SmallBCD(NewAccent1);
  1502.     }
  1503.  
  1504.  
  1505. /* change the second accent factor for the note */
  1506. void                                    PutNoteAccent2(NoteObjectRec* Note, double NewAccent2)
  1507.     {
  1508.         CheckPtrExistence(Note);
  1509.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteAccent2:  called on command"));
  1510.         Note->a.Note.Accent2 = Double2SmallBCD(NewAccent2);
  1511.     }
  1512.  
  1513.  
  1514. /* change the third accent factor for the note */
  1515. void                                    PutNoteAccent3(NoteObjectRec* Note, double NewAccent3)
  1516.     {
  1517.         CheckPtrExistence(Note);
  1518.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteAccent3:  called on command"));
  1519.         Note->a.Note.Accent3 = Double2SmallBCD(NewAccent3);
  1520.     }
  1521.  
  1522.  
  1523. /* change the fourth accent factor for the note */
  1524. void                                    PutNoteAccent4(NoteObjectRec* Note, double NewAccent4)
  1525.     {
  1526.         CheckPtrExistence(Note);
  1527.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteAccent4:  called on command"));
  1528.         Note->a.Note.Accent4 = Double2SmallBCD(NewAccent4);
  1529.     }
  1530.  
  1531.  
  1532. /* change the pitch that the table selector should treat the note as using */
  1533. void                                    PutNoteMultisampleFalsePitch(NoteObjectRec* Note,
  1534.                                                 short NewFalsePitch)
  1535.     {
  1536.         CheckPtrExistence(Note);
  1537.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1538.             "PutNoteMultisampleFalsePitch:  called on command"));
  1539.         Note->a.Note.MultisamplePitchAsIf = NewFalsePitch;
  1540.     }
  1541.  
  1542.  
  1543. /* change the pitch displacement depth adjust factor for the note */
  1544. void                                    PutNotePitchDisplacementDepthAdjust(NoteObjectRec* Note,
  1545.                                                 double NewPitchDisplacementDepthAdjust)
  1546.     {
  1547.         CheckPtrExistence(Note);
  1548.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1549.             "PutNotePitchDisplacementDepthAdjust:  called on command"));
  1550.         Note->a.Note.PitchDisplacementDepthAdjustment
  1551.             = Double2SmallBCD(NewPitchDisplacementDepthAdjust);
  1552.     }
  1553.  
  1554.  
  1555. /* change the pitch displacement rate adjust factor for the note */
  1556. void                                    PutNotePitchDisplacementRateAdjust(NoteObjectRec* Note,
  1557.                                                 double NewPitchDisplacementRateAdjust)
  1558.     {
  1559.         CheckPtrExistence(Note);
  1560.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1561.             "PutNotePitchDisplacementRateAdjust:  called on command"));
  1562.         Note->a.Note.PitchDisplacementRateAdjustment
  1563.             = Double2SmallBCD(NewPitchDisplacementRateAdjust);
  1564.     }
  1565.  
  1566.  
  1567. /* change the pitch displacement envelope start point */
  1568. void                                    PutNotePitchDisplacementStartPoint(NoteObjectRec* Note,
  1569.                                                 double NewPitchDisplacementStartPoint)
  1570.     {
  1571.         CheckPtrExistence(Note);
  1572.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1573.             "PutNotePitchDisplacementStartPoint:  called on command"));
  1574.         Note->a.Note.PitchDisplacementStartPoint
  1575.             = Double2SmallBCD(NewPitchDisplacementStartPoint);
  1576.     }
  1577.  
  1578.  
  1579. /* change the hurryup factor for the note */
  1580. void                                    PutNoteHurryUpFactor(NoteObjectRec* Note, double NewHurryUpFactor)
  1581.     {
  1582.         CheckPtrExistence(Note);
  1583.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1584.             "PutNoteHurryUpFactor:  called on command"));
  1585.         Note->a.Note.HurryUpFactor = Double2SmallBCD(NewHurryUpFactor);
  1586.     }
  1587.  
  1588.  
  1589. /* change the detuning adjustment for the note */
  1590. void                                    PutNoteDetuning(NoteObjectRec* Note, double NewDetuning)
  1591.     {
  1592.         CheckPtrExistence(Note);
  1593.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteDetuning:  called on command"));
  1594.         Note->a.Note.Detuning = Double2SmallBCD(NewDetuning);
  1595.     }
  1596.  
  1597.  
  1598. /* get the opcode for a command */
  1599. NoteCommands                    GetCommandOpcode(NoteObjectRec* Command)
  1600.     {
  1601.         CheckPtrExistence(Command);
  1602.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,"GetCommandOpcode:  called on note"));
  1603.         return (NoteCommands)(Command->Flags & ~eCommandFlag);
  1604.     }
  1605.  
  1606.  
  1607. /* put a new opcode in the command */
  1608. void                                    PutCommandOpcode(NoteObjectRec* Command, NoteCommands NewOpcode)
  1609.     {
  1610.         CheckPtrExistence(Command);
  1611.         ERROR(!IsItACommand(Command),PRERR(ForceAbort,"PutCommandOpcode:  called on note"));
  1612.         ERROR((NewOpcode & eCommandFlag) != 0,PRERR(AllowResume,
  1613.             "PutCommandOpcode:  command flag is set on new opcode word"));
  1614.         Command->Flags = (Command->Flags & eCommandFlag) | (unsigned long)NewOpcode;
  1615.     }
  1616.  
  1617.  
  1618. /* get the duration of a note */
  1619. unsigned long                    GetNoteDuration(NoteObjectRec* Note)
  1620.     {
  1621.         CheckPtrExistence(Note);
  1622.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteDuration:  called on command"));
  1623.         return (Note->Flags & eDurationMask);
  1624.     }
  1625.  
  1626.  
  1627. /* get the duration division of a note */
  1628. unsigned long                    GetNoteDurationDivision(NoteObjectRec* Note)
  1629.     {
  1630.         CheckPtrExistence(Note);
  1631.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1632.             "GetNoteDurationDivision:  called on command"));
  1633.         return (Note->Flags & eDivisionMask);
  1634.     }
  1635.  
  1636.  
  1637. /* get the dot status of a note */
  1638. MyBoolean                            GetNoteDotStatus(NoteObjectRec* Note)
  1639.     {
  1640.         CheckPtrExistence(Note);
  1641.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteDotStatus:  called on command"));
  1642.         return ((Note->Flags & eDotModifier) != 0);
  1643.     }
  1644.  
  1645.  
  1646. /* get the flat or sharp status of a note */
  1647. unsigned long                    GetNoteFlatOrSharpStatus(NoteObjectRec* Note)
  1648.     {
  1649.         CheckPtrExistence(Note);
  1650.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1651.             "GetNoteFlatOrSharpStatus:  called on command"));
  1652.         return (Note->Flags & (eFlatModifier | eSharpModifier));
  1653.     }
  1654.  
  1655.  
  1656. /* get the rest status of a note */
  1657. MyBoolean                            GetNoteIsItARest(NoteObjectRec* Note)
  1658.     {
  1659.         CheckPtrExistence(Note);
  1660.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"GetNoteIsItARest:  called on command"));
  1661.         return ((Note->Flags & eRestModifier) != 0);
  1662.     }
  1663.  
  1664.  
  1665. /* get the first release point origin of a note */
  1666. unsigned long                    GetNoteRelease1Origin(NoteObjectRec* Note)
  1667.     {
  1668.         CheckPtrExistence(Note);
  1669.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1670.             "GetNoteRelease1Origin:  called on command"));
  1671.         return (Note->Flags & eRelease1OriginMask);
  1672.     }
  1673.  
  1674.  
  1675. /* get the second release point origin of a note */
  1676. unsigned long                    GetNoteRelease2Origin(NoteObjectRec* Note)
  1677.     {
  1678.         CheckPtrExistence(Note);
  1679.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1680.             "GetNoteRelease2Origin:  called on command"));
  1681.         return (Note->Flags & eRelease2OriginMask);
  1682.     }
  1683.  
  1684.  
  1685. /* get the third release from start instead of end flag of a note */
  1686. MyBoolean                            GetNoteRelease3FromStartInsteadOfEnd(NoteObjectRec* Note)
  1687.     {
  1688.         CheckPtrExistence(Note);
  1689.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1690.             "GetNoteRelease3FromStartInsteadOfEnd:  called on command"));
  1691.         return ((Note->Flags & eRelease3FromStartNotEnd) != 0);
  1692.     }
  1693.  
  1694.  
  1695. /* get the pitch displacement origin of a note */
  1696. unsigned long                    GetNotePitchDisplacementStartOrigin(NoteObjectRec* Note)
  1697.     {
  1698.         CheckPtrExistence(Note);
  1699.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1700.             "GetNotePitchDisplacementStartOrigin:  called on command"));
  1701.         return (Note->Flags & ePitchDisplacementStartOriginMask);
  1702.     }
  1703.  
  1704.  
  1705. /* get the detuning pitch conversion mode of a note */
  1706. unsigned long                    GetNoteDetuneConversionMode(NoteObjectRec* Note)
  1707.     {
  1708.         CheckPtrExistence(Note);
  1709.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1710.             "GetNoteDetuneConversionMode:  called on command"));
  1711.         return (Note->Flags & eDetuningModeMask);
  1712.     }
  1713.  
  1714.  
  1715. /* get the retrigger envelope on tie status of a note */
  1716. MyBoolean                            GetNoteRetriggerEnvelopesOnTieStatus(NoteObjectRec* Note)
  1717.     {
  1718.         CheckPtrExistence(Note);
  1719.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1720.             "GetNoteRetriggerEnvelopesOnTieStatus:  called on command"));
  1721.         return ((Note->Flags & eRetriggerEnvelopesOnTieFlag) != 0);
  1722.     }
  1723.  
  1724.  
  1725. /* get the duration adjustment mode of a note */
  1726. unsigned long                    GetNoteDurationAdjustMode(NoteObjectRec* Note)
  1727.     {
  1728.         CheckPtrExistence(Note);
  1729.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1730.             "GetNoteDurationAdjustMode:  called on command"));
  1731.         return (Note->Flags & eDurationAdjustMask);
  1732.     }
  1733.  
  1734.  
  1735. /* get a flag indicating that portamento should use Hertz instead of halfsteps */
  1736. MyBoolean                            GetNotePortamentoHertzNotHalfstepsFlag(NoteObjectRec* Note)
  1737.     {
  1738.         CheckPtrExistence(Note);
  1739.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1740.             "GetNotePortamentoHertzNotHalfstepsFlag:  called on command"));
  1741.         return ((Note->Flags & ePortamentoHertzNotHalfsteps) != 0);
  1742.     }
  1743.  
  1744.  
  1745. /* change the duration of a note */
  1746. void                                    PutNoteDuration(NoteObjectRec* Note, unsigned long NewDuration)
  1747.     {
  1748.         CheckPtrExistence(Note);
  1749.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteDuration:  called on command"));
  1750.         ERROR((NewDuration != e64thNote) && (NewDuration != e32ndNote)
  1751.             && (NewDuration != e16thNote) && (NewDuration != e8thNote)
  1752.             && (NewDuration != e4thNote) && (NewDuration != e2ndNote)
  1753.             && (NewDuration != eWholeNote) && (NewDuration != eDoubleNote)
  1754.             && (NewDuration != eQuadNote),PRERR(ForceAbort,
  1755.             "PutNoteDuration:  bad duration value"));
  1756.         Note->Flags = (Note->Flags & ~eDurationMask) | NewDuration;
  1757.     }
  1758.  
  1759.  
  1760. /* change the duration division of a note */
  1761. void                                    PutNoteDurationDivision(NoteObjectRec* Note,
  1762.                                                 unsigned long NewDivision)
  1763.     {
  1764.         CheckPtrExistence(Note);
  1765.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1766.             "PutNoteDurationDivision:  called on command"));
  1767.         ERROR((NewDivision != eDiv1Modifier) && (NewDivision != eDiv3Modifier)
  1768.             && (NewDivision != eDiv5Modifier) && (NewDivision != eDiv7Modifier),
  1769.             PRERR(ForceAbort,"PutNoteDurationDivision:  bad division value"));
  1770.         Note->Flags = (Note->Flags & ~eDivisionMask) | NewDivision;
  1771.     }
  1772.  
  1773.  
  1774. /* change the dot status of a note */
  1775. void                                    PutNoteDotStatus(NoteObjectRec* Note, MyBoolean HasADot)
  1776.     {
  1777.         CheckPtrExistence(Note);
  1778.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteDotStatus:  called on command"));
  1779.         if (HasADot)
  1780.             {
  1781.                 Note->Flags |= eDotModifier;
  1782.             }
  1783.          else
  1784.             {
  1785.                 Note->Flags &= ~eDotModifier;
  1786.             }
  1787.     }
  1788.  
  1789.  
  1790. /* change the flat or sharp status of a note */
  1791. void                                    PutNoteFlatOrSharpStatus(NoteObjectRec* Note,
  1792.                                                 unsigned long NewFlatOrSharpStatus)
  1793.     {
  1794.         CheckPtrExistence(Note);
  1795.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1796.             "PutNoteFlatOrSharpStatus:  called on command"));
  1797.         ERROR((NewFlatOrSharpStatus != 0) && (NewFlatOrSharpStatus != eFlatModifier)
  1798.             && (NewFlatOrSharpStatus != eSharpModifier),PRERR(ForceAbort,
  1799.             "PutNoteFlatOrSharpStatus:  bad sharp or flat status"));
  1800.         Note->Flags = (Note->Flags & ~(eSharpModifier | eFlatModifier))
  1801.             | NewFlatOrSharpStatus;
  1802.     }
  1803.  
  1804.  
  1805. /* change the rest status of a note */
  1806. void                                    PutNoteIsItARest(NoteObjectRec* Note, MyBoolean IsARest)
  1807.     {
  1808.         CheckPtrExistence(Note);
  1809.         ERROR(IsItACommand(Note),PRERR(ForceAbort,"PutNoteIsItARest:  called on command"));
  1810.         if (IsARest)
  1811.             {
  1812.                 Note->Flags |= eRestModifier;
  1813.             }
  1814.          else
  1815.             {
  1816.                 Note->Flags &= ~eRestModifier;
  1817.             }
  1818.     }
  1819.  
  1820.  
  1821. /* change the first release point origin of a note */
  1822. void                                    PutNoteRelease1Origin(NoteObjectRec* Note,
  1823.                                                 unsigned long NewReleasePoint1Origin)
  1824.     {
  1825.         CheckPtrExistence(Note);
  1826.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1827.             "PutNoteRelease1Origin:  called on command"));
  1828.         ERROR((NewReleasePoint1Origin != eRelease1FromDefault)
  1829.             && (NewReleasePoint1Origin != eRelease1FromStart)
  1830.             && (NewReleasePoint1Origin != eRelease1FromEnd),PRERR(ForceAbort,
  1831.             "PutNoteRelease1Origin:  bad origin value"));
  1832.         Note->Flags = (Note->Flags & ~eRelease1OriginMask) | NewReleasePoint1Origin;
  1833.     }
  1834.  
  1835.  
  1836. /* change the second release point origin of a note */
  1837. void                                    PutNoteRelease2Origin(NoteObjectRec* Note,
  1838.                                                 unsigned long NewReleasePoitn2Origin)
  1839.     {
  1840.         CheckPtrExistence(Note);
  1841.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1842.             "PutNoteRelease2Origin:  called on command"));
  1843.         ERROR((NewReleasePoitn2Origin != eRelease2FromDefault)
  1844.             && (NewReleasePoitn2Origin != eRelease2FromStart)
  1845.             && (NewReleasePoitn2Origin != eRelease2FromEnd),PRERR(ForceAbort,
  1846.             "PutNoteRelease2Origin:  bad origin value"));
  1847.         Note->Flags = (Note->Flags & ~eRelease2OriginMask) | NewReleasePoitn2Origin;
  1848.     }
  1849.  
  1850.  
  1851. /* change the third release from start instead of end flag of a note */
  1852. void                                    PutNoteRelease3FromStartInsteadOfEnd(NoteObjectRec* Note,
  1853.                                                 MyBoolean ShouldWeReleasePoint3FromStartInsteadOfEnd)
  1854.     {
  1855.         CheckPtrExistence(Note);
  1856.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1857.             "PutNoteRelease3FromStartInsteadOfEnd:  called on command"));
  1858.         if (ShouldWeReleasePoint3FromStartInsteadOfEnd)
  1859.             {
  1860.                 Note->Flags |= eRelease3FromStartNotEnd;
  1861.             }
  1862.          else
  1863.             {
  1864.                 Note->Flags &= ~eRelease3FromStartNotEnd;
  1865.             }
  1866.     }
  1867.  
  1868.  
  1869. /* change the pitch displacement origin of a note */
  1870. void                                    PutNotePitchDisplacementStartOrigin(NoteObjectRec* Note,
  1871.                                                 unsigned long NewPitchDisplacementStartOrigin)
  1872.     {
  1873.         CheckPtrExistence(Note);
  1874.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1875.             "PutNotePitchDisplacementStartOrigin:  called on command"));
  1876.         ERROR((NewPitchDisplacementStartOrigin != ePitchDisplacementStartFromDefault)
  1877.             && (NewPitchDisplacementStartOrigin != ePitchDisplacementStartFromStart)
  1878.             && (NewPitchDisplacementStartOrigin != ePitchDisplacementStartFromEnd),
  1879.             PRERR(ForceAbort,"PutNotePitchDisplacementStartOrigin:  bad origin value"));
  1880.         Note->Flags = (Note->Flags & ~ePitchDisplacementStartOriginMask)
  1881.             | NewPitchDisplacementStartOrigin;
  1882.     }
  1883.  
  1884.  
  1885. /* change the detuning pitch conversion mode of a note */
  1886. void                                    PutNoteDetuneConversionMode(NoteObjectRec* Note,
  1887.                                                 unsigned long NewDetuneConversionMode)
  1888.     {
  1889.         CheckPtrExistence(Note);
  1890.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1891.             "PutNoteDetuneConversionMode:  called on command"));
  1892.         ERROR((NewDetuneConversionMode != eDetuningModeDefault)
  1893.             && (NewDetuneConversionMode != eDetuningModeHalfSteps)
  1894.             && (NewDetuneConversionMode != eDetuningModeHertz),PRERR(ForceAbort,
  1895.             "PutNoteDetuneConversionMode:  bad mode value"));
  1896.         Note->Flags = (Note->Flags & ~eDetuningModeMask) | NewDetuneConversionMode;
  1897.     }
  1898.  
  1899.  
  1900. /* change the retrigger envelope on tie status of a note */
  1901. void                                    PutNoteRetriggerEnvelopesOnTieStatus(NoteObjectRec* Note,
  1902.                                                 MyBoolean ShouldWeRetriggerEnvelopesOnTie)
  1903.     {
  1904.         CheckPtrExistence(Note);
  1905.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1906.             "PutNoteRetriggerEnvelopesOnTieStatus:  called on command"));
  1907.         if (ShouldWeRetriggerEnvelopesOnTie)
  1908.             {
  1909.                 Note->Flags |= eRetriggerEnvelopesOnTieFlag;
  1910.             }
  1911.          else
  1912.             {
  1913.                 Note->Flags &= ~eRetriggerEnvelopesOnTieFlag;
  1914.             }
  1915.     }
  1916.  
  1917.  
  1918. /* change the duration adjustment mode of a note */
  1919. void                                    PutNoteDurationAdjustMode(NoteObjectRec* Note,
  1920.                                                 unsigned long NewDurationAdjustMode)
  1921.     {
  1922.         CheckPtrExistence(Note);
  1923.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1924.             "GetNoteDurationAdjustMode:  called on command"));
  1925.         ERROR((NewDurationAdjustMode != eDurationAdjustDefault)
  1926.             && (NewDurationAdjustMode != eDurationAdjustAdditive)
  1927.             && (NewDurationAdjustMode != eDurationAdjustMultiplicative),PRERR(ForceAbort,
  1928.             "PutNoteDurationAdjustMode:  bad value"));
  1929.         Note->Flags = (Note->Flags & ~eDurationAdjustMask) | NewDurationAdjustMode;
  1930.     }
  1931.  
  1932.  
  1933. /* change the flag indicating that portamento should use Hertz instead of halfsteps */
  1934. void                                    PutNotePortamentoHertzNotHalfstepsFlag(NoteObjectRec* Note,
  1935.                                                 MyBoolean ShouldWeUseHertzInsteadOfHalfsteps)
  1936.     {
  1937.         CheckPtrExistence(Note);
  1938.         ERROR(IsItACommand(Note),PRERR(ForceAbort,
  1939.             "PutNotePortamentoHertzNotHalfstepsFlag:  called on command"));
  1940.         if (ShouldWeUseHertzInsteadOfHalfsteps)
  1941.             {
  1942.                 Note->Flags |= ePortamentoHertzNotHalfsteps;
  1943.             }
  1944.          else
  1945.             {
  1946.                 Note->Flags &= ~ePortamentoHertzNotHalfsteps;
  1947.             }
  1948.     }
  1949.  
  1950.  
  1951. /* Note Object Subblock Format: */
  1952. /* Each note/command has the following field: */
  1953. /*   4-byte unsigned little endian opcode field */
  1954. /*       for a command, the high bit will be 1 and the remaining bits will */
  1955. /*       be the opcode.  for a note, the high bit will be 0. */
  1956.  
  1957. /* Remainder of Note Variant Subblock: */
  1958. /*   definitions for the remaining bits in the opcode field */
  1959. /*       bits 0-3:  duration integer. */
  1960. /*         0001 = 64th note */
  1961. /*         0010 = 32nd note */
  1962. /*         0011 = 16th note */
  1963. /*         0100 = 8th note */
  1964. /*         0101 = quarter note */
  1965. /*         0110 = half note */
  1966. /*         0111 = whole note */
  1967. /*         1000 = double note */
  1968. /*         1001 = quad note */
  1969. /*         all other values are not permitted */
  1970. /*       bits 4-5:  division mask */
  1971. /*         00 = divide duration by 1 (no change in duration) */
  1972. /*         01 = divide duration by 3 (triplets) */
  1973. /*         10 = divide duration by 5 */
  1974. /*         11 = divide duration by 7 */
  1975. /*       bit 6:  dotted note flag (1 = dot) */
  1976. /*       bit 7:  flat modifier (1 = flat);  this is used for notation only */
  1977. /*         at most 1 of the flat or sharp modifiers can be set */
  1978. /*       bit 8:  sharp modifier (1 = sharp);  this is used for notation only */
  1979. /*         at most 1 of the flat or sharp modifiers can be set */
  1980. /*       bit 9:  rest modifier (1 = rest instead of note) */
  1981. /*       bits 10-11:  release point 1 origin */
  1982. /*         01 = use default origin */
  1983. /*         10 = measure release point from start of note */
  1984. /*         11 = measure release point from end of note */
  1985. /*         other values are not permitted */
  1986. /*       bits 12-13:  release point 2 origin */
  1987. /*         01 = use default origin */
  1988. /*         10 = measure release point from start of note */
  1989. /*         11 = measure release point from end of note */
  1990. /*         other values are not permitted */
  1991. /*       bit 14:  release point 3 origin (1 = from start instead of end) */
  1992. /*         0 = release 3 occurs at end of note */
  1993. /*         1 = release 3 occurs at start of note */
  1994. /*       bits 15-16:  pitch displacement start point origin */
  1995. /*         01 = use default origin */
  1996. /*         10 = pitch displacement start point from start of note */
  1997. /*         11 = pitch displacement start point from end of note */
  1998. /*         other values are not permitted */
  1999. /*       bits 17-18:  pitch displacement depth modulation mode */
  2000. /*         01 = use default pitch modulation scale */
  2001. /*         10 = treat modulation index as half-step number */
  2002. /*         11 = treat modulation index as hertz */
  2003. /*         other values are not permitted */
  2004. /*       bits 19-20:  detuning mode */
  2005. /*         01 = use default treat detuning scale */
  2006. /*         10 = treat detuning value as half-step number */
  2007. /*         11 = treat detuning value as hertz */
  2008. /*         other values are not permitted */
  2009. /*       bits 21-22:  note duration adjustment scale */
  2010. /*         01 = use default duration adjustment scale */
  2011. /*         10 = add duration adjustment to the duration */
  2012. /*         11 = multiply the duration adjustment by the duration */
  2013. /*         other values are not permitted */
  2014. /*       bit 23:  retrigger envelopes on tie flag */
  2015. /*       bit 24:  portamento linear in hertz instead of half steps (1 = hertz) */
  2016. /*       bits 25-31:  set to zero! */
  2017. /*   2-byte signed little endian pitch index */
  2018. /*       should be a value in the range 0..383.  Middle C (261.6 Hertz) = 192 */
  2019. /*   2-byte little endian small integer coded decimal portamento duration. */
  2020. /*       this determines how long a portamento will last, in fractions of a quarter */
  2021. /*       note.  it only has effect if the note is the target of a tie.  a value of */
  2022. /*       0 means instantaneous, i.e. no portamento. */
  2023. /*       A small integer coded decimal is the decimal * 1000 with a range */
  2024. /*       of -29.999 to 29.999 */
  2025. /*   2-byte little endian small integer coded decimal early/late adjustment */
  2026. /*       this determines the displacement in time of the occurrence of the note */
  2027. /*       in frations of a quarter note. */
  2028. /*   2-byte little endian small integer coded decimal duration adjustment */
  2029. /*       this value changes the duration of the note by being added to the */
  2030. /*       duration or being multiplied by the duration. */
  2031. /*   2-byte little endian small integer coded decimal release point 1 location */
  2032. /*       this determines when the release of the first sustain/loop will occur */
  2033. /*       in fractions of the current note's duration.  it is relative to the origin */
  2034. /*       as determined by the opcode field. */
  2035. /*   2-byte little endian small integer coded decimal release point 2 location */
  2036. /*       this determines when the release of the second sustain/loop will occur. */
  2037. /*   2-byte little endian small integer coded decimal overall loudness adjustment */
  2038. /*       this factor scales the total volume output of the oscillators for this */
  2039. /*       particular note.  It is multiplied, so a value of 1 makes no change in */
  2040. /*       loudness. */
  2041. /*   2-byte little endian small integer coded decimal stereo position adjustment. */
  2042. /*       this value adjusts where the sound will be located in stereo.  -1 is */
  2043. /*       the far left, 1 is the far right, and 0 is center. */
  2044. /*   2-byte little endian small integer coded decimal surround position adjustment. */
  2045. /*       this value adjusts where the sound will be located in surround sound.  */
  2046. /*       1 is front and -1 is rear. */
  2047. /*   2-byte little endian small integer coded decimal accent 1 value */
  2048. /*   2-byte little endian small integer coded decimal accent 2 value */
  2049. /*   2-byte little endian small integer coded decimal accent 3 value */
  2050. /*   2-byte little endian small integer coded decimal accent 4 value */
  2051. /*   2-byte little endian fake pitch value */
  2052. /*       this value has a range of -1..383.  If it is not -1, then it will be used */
  2053. /*       to determine which sample a multisampled oscillator will use.  If it is -1 */
  2054. /*       then the actual pitch will be used to select a sample. */
  2055. /*   2-byte little endian small integer coded decimal pitch disp depth adjustment */
  2056. /*       this adjusts the maximum amplitude of the pitch displacement depth */
  2057. /*       oscillator (vibrato).  The value has units of either half steps or hertz */
  2058. /*       depending on the setting in the opcode word. */
  2059. /*   2-byte little endian small integer coded decimal pitch displ rate adjustment */
  2060. /*       this adjusts the maximum amplitude of the pitch displacement rate */
  2061. /*       oscillator. the units are periods per second. */
  2062. /*   2-byte little endian small integer coded decimal pitch displ start point adjust */
  2063. /*       this value adjusts when the pitch displacement envelopes start.  the */
  2064. /*       location is from start or end of note, depending on the opcode settings, and */
  2065. /*       is in fractions of the current note's duration. */
  2066. /*   2-byte little endian small integer coded decimal hurry-up factor */
  2067. /*       this factor scales the total speed at which all envelopes change.  this is */
  2068. /*       multiplicative, so a value of 1 makes no change, and smaller values make */
  2069. /*       transitions go faster. */
  2070. /*   2-byte little endian small integer coded decimal detuning value */
  2071. /*       this value is added to the pitch of the note to detune.  its units are */
  2072. /*       either hertz or half steps depending on the opcode word. */
  2073.  
  2074. /* Remainder of Command Variant Subblock: */
  2075. /*   lower 31 bits of the command opcode: */
  2076. /*        16 = restore tempo */
  2077. /*        17 = set tempo */
  2078. /*        18 = adjust tempo */
  2079. /*        19 = sweep tempo absolute */
  2080. /*        20 = sweep tempo relative */
  2081. /*       32 = restore stereo position */
  2082. /*       33 = set stereo position */
  2083. /*       34 = adjust stereo position */
  2084. /*       35 = sweep stereo position absolute */
  2085. /*       36 = sweep stereo position relative */
  2086. /*        48 = restore volume */
  2087. /*        49 = set volume */
  2088. /*        50 = adjust volume */
  2089. /*        51 = sweep volume absolute */
  2090. /*        52 = sweep volume relative */
  2091. /*       64 = restore release point 1 */
  2092. /*       65 = set release point 1 */
  2093. /*       66 = adjust release point 1 */
  2094. /*       67 = set release point 1 origin */
  2095. /*       68 = sweep release point 1 absolute */
  2096. /*       69 = sweep release point 1 relative */
  2097. /*        80 = restore release point 2 */
  2098. /*        81 = set release point 2 */
  2099. /*        82 = adjust release point 2 */
  2100. /*        83 = set release point 2 origin */
  2101. /*        84 = sweep release point 2 absolute */
  2102. /*        85 = sweep release point 2 relative */
  2103. /*       96 = restore accent 1 */
  2104. /*       97 = set accent 1 */
  2105. /*       98 = adjust accent 1 */
  2106. /*       99 = sweep accent 1 absolute */
  2107. /*       100 = sweep accent 1 relative */
  2108. /*        112 = restore accent 2 */
  2109. /*        113 = set accent 2 */
  2110. /*        114 = adjust accent 2 */
  2111. /*        115 = sweep accent 2 absolute */
  2112. /*        116 = sweep accent 2 relative */
  2113. /*       128 = restore accent 3 */
  2114. /*       129 = set accent 3 */
  2115. /*       130 = adjust accent 3 */
  2116. /*       131 = sweep accent 3 absolute */
  2117. /*       132 = sweep accent 3 relative */
  2118. /*        144 = restore accent 4 */
  2119. /*        145 = set accent 4 */
  2120. /*        146 = adjust accent 4 */
  2121. /*        147 = sweep accent 4 absolute */
  2122. /*        148 = sweep accent 4 relative */
  2123. /*       160 = restore pitch displacement depth */
  2124. /*       161 = set pitch displacement depth */
  2125. /*       162 = adjust pitch displacement depth */
  2126. /*       163 = set pitch displacement depth modulation mode */
  2127. /*           *** 163 has been eliminated in the version 2 file format */
  2128. /*       164 = sweep pitch displacement depth absolute */
  2129. /*       165 = sweep pitch displacement depth relative */
  2130. /*        176 = restore pitch displacement rate */
  2131. /*        177 = set pitch displacement rate */
  2132. /*        178 = adjust pitch displacement rate */
  2133. /*        179 = sweep pitch displacement rate absolute */
  2134. /*        180 = sweep pitch displacement rate relative */
  2135. /*       192 = restore pitch displacement start point */
  2136. /*       193 = set pitch displacement start point */
  2137. /*       194 = adjust pitch displacement start point */
  2138. /*       195 = set pitch displacement start point origin */
  2139. /*       196 = sweep pitch displacement start point absolute */
  2140. /*       197 = sweep pitch displacement start point relative */
  2141. /*        208 = restore hurry-up factor */
  2142. /*        209 = set hurry-up factor */
  2143. /*        210 = adjust hurry-up factor */
  2144. /*        211 = sweep hurry-up factor absolute */
  2145. /*        212 = sweep hurry-up factor relative */
  2146. /*       224 = restore detuning */
  2147. /*       225 = set detuning */
  2148. /*       226 = adjust detuning */
  2149. /*       227 = set detuning mode */
  2150. /*       228 = sweep detuning absolute */
  2151. /*       229 = sweep detuning relative */
  2152. /*        240 = restore early/late adjust */
  2153. /*        241 = set early/late adjust */
  2154. /*        242 = adjust early/late adjust */
  2155. /*        243 = sweep early/late adjust absolute */
  2156. /*        244 = sweep early/late adjust relative */
  2157. /*       256 = restore duration adjust */
  2158. /*       257 = set duration adjust */
  2159. /*       258 = adjust duration adjust */
  2160. /*       259 = sweep duration adjust absolute */
  2161. /*       260 = sweep duration adjust relative */
  2162. /*       261 = set duration adjust mode */
  2163. /*        272 = set meter */
  2164. /*        273 = set measure number */
  2165. /*       288 = comment */
  2166. /*        304 = restore surround position */
  2167. /*        305 = set surround position */
  2168. /*        306 = adjust surround position */
  2169. /*        307 = sweep surround position absolute */
  2170. /*        308 = sweep surround position relative */
  2171. /*       320 = set transpose */
  2172. /*       321 = adjust transpose */
  2173. /*        336 = set effect accent 1 */
  2174. /*        337 = adjust effect accent 1 */
  2175. /*        338 = sweep effect accent 1 absolute */
  2176. /*        339 = sweep effect accent 1 relative */
  2177. /*       352 = set effect accent 2 */
  2178. /*       353 = adjust effect accent 2 */
  2179. /*       354 = sweep effect accent 2 absolute */
  2180. /*       355 = sweep effect accent 2 relative */
  2181. /*        368 = set effect accent 3 */
  2182. /*        369 = adjust effect accent 3 */
  2183. /*        370 = sweep effect accent 3 absolute */
  2184. /*        371 = sweep effect accent 3 relative */
  2185. /*       384 = set effect accent 4 */
  2186. /*       385 = adjust effect accent 4 */
  2187. /*       386 = sweep effect accent 4 absolute */
  2188. /*       387 = sweep effect accent 4 relative */
  2189. /*        400 = set global score effect accent 1 */
  2190. /*        401 = adjust global score effect accent 1 */
  2191. /*        402 = sweep global score effect accent 1 absolute */
  2192. /*        403 = sweep global score effect accent 1 relative */
  2193. /*       416 = set global score effect accent 2 */
  2194. /*       417 = adjust global score effect accent 2 */
  2195. /*       418 = sweep global score effect accent 2 absolute */
  2196. /*       419 = sweep global score effect accent 2 relative */
  2197. /*        432 = set global score effect accent 3 */
  2198. /*        433 = adjust global score effect accent 3 */
  2199. /*        434 = sweep global score effect accent 3 absolute */
  2200. /*        435 = sweep global score effect accent 3 relative */
  2201. /*       448 = set global score effect accent 4 */
  2202. /*       449 = adjust global score effect accent 4 */
  2203. /*       450 = sweep global score effect accent 4 absolute */
  2204. /*       451 = sweep global score effect accent 4 relative */
  2205. /*        464 = track effects switch */
  2206. /*       no other values besides these are allowed! */
  2207. /* Format of data for each command (not including the 4-byte opcode word): */
  2208. /* 16 = restore tempo */
  2209. /*   no arguments */
  2210. /* 17 = set tempo */
  2211. /*   4-byte little endian extended integer coded decimal number of beats per minute */
  2212. /*       an extended integer coded decimal is 1000 * the decimal value, with */
  2213. /*       a range of -1999999.999 to 1999999.999 */
  2214. /* 18 = adjust tempo */
  2215. /*   4-byte little endian extended integer coded decimal beats per minute adjust */
  2216. /* 19 = sweep tempo absolute */
  2217. /*   4-byte little endian extended integer coded decimal target beats per minute */
  2218. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2219. /* 20 = sweep tempo relative */
  2220. /*   4-byte little endian extended integer coded decimal target beats per minute adjust */
  2221. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2222. /* 32 = restore stereo position */
  2223. /*   no arguments */
  2224. /* 33 = set stereo position */
  2225. /*   4-byte little endian large integer coded decimal stereo position value */
  2226. /*       -1 is left, 1 is right, 0 is center */
  2227. /* 34 = adjust stereo position */
  2228. /*   4-byte little endian large integer coded decimal stereo position adjustment */
  2229. /* 35 = sweep stereo position absolute */
  2230. /*   4-byte little endian large integer coded decimal target stereo position */
  2231. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2232. /* 36 = sweep stereo position relative */
  2233. /*   4-byte little endian large integer coded decimal target stereo position adjust */
  2234. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2235. /* 48 = restore volume */
  2236. /*   no arguments */
  2237. /* 49 = set volume */
  2238. /*   4-byte little endian large integer coded decimal volume level specifier */
  2239. /* 50 = adjust volume */
  2240. /*   4-byte little endian large integer coded decimal volume level adjustment */
  2241. /* 51 = sweep volume absolute */
  2242. /*   4-byte little endian large integer coded decimal target volume level */
  2243. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2244. /* 52 = sweep volume relative */
  2245. /*   4-byte little endian large integer coded decimal target volume level adjust */
  2246. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2247. /* 64 = restore release point 1 */
  2248. /*   no arguments */
  2249. /* 65 = set release point 1 */
  2250. /*   4-byte little endian large integer coded decimal release point */
  2251. /* 66 = adjust release point 1 */
  2252. /*   4-byte little endian large integer coded decimal release point adjust */
  2253. /* 67 = set release point 1 origin */
  2254. /*   1-byte origin specifier */
  2255. /*       0 = from start */
  2256. /*       1 = from end */
  2257. /* 68 = sweep release point 1 absolute */
  2258. /*   4-byte little endian large integer coded decimal target release point */
  2259. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2260. /* 69 = sweep release point 1 relative */
  2261. /*   4-byte little endian large integer coded decimal target release point adjust */
  2262. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2263. /* 80 = restore release point 2 */
  2264. /*   no arguments */
  2265. /* 81 = set release point 2 */
  2266. /*   4-byte little endian large integer coded decimal release point */
  2267. /* 82 = adjust release point 2 */
  2268. /*   4-byte little endian large integer coded decimal release point adjust */
  2269. /* 83 = set release point 2 origin */
  2270. /*   1-byte origin specifier */
  2271. /*       0 = from start */
  2272. /*       1 = from end */
  2273. /* 84 = sweep release point 2 absolute */
  2274. /*   4-byte little endian large integer coded decimal target release point */
  2275. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2276. /* 85 = sweep release point 2 relative */
  2277. /*   4-byte little endian large integer coded decimal target release point adjust */
  2278. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2279. /* 96 = restore accent 1 */
  2280. /*   no arguments */
  2281. /* 97 = set accent 1 */
  2282. /*   4-byte little endian large integer coded decimal accent value */
  2283. /* 98 = adjust accent 1 */
  2284. /*   4-byte little endian large integer coded decimal accent adjust */
  2285. /* 99 = sweep accent 1 absolute */
  2286. /*   4-byte little endian large integer coded decimal target accent */
  2287. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2288. /* 100 = sweep accent 1 relative */
  2289. /*   4-byte little endian large integer coded decimal target accent adjust */
  2290. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2291. /* 112 = restore accent 2 */
  2292. /*   no arguments */
  2293. /* 113 = set accent 2 */
  2294. /*   4-byte little endian large integer coded decimal accent value */
  2295. /* 114 = adjust accent 2 */
  2296. /*   4-byte little endian large integer coded decimal accent adjust */
  2297. /* 115 = sweep accent 2 absolute */
  2298. /*   4-byte little endian large integer coded decimal target accent */
  2299. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2300. /* 116 = sweep accent 2 relative */
  2301. /*   4-byte little endian large integer coded decimal target accent adjust */
  2302. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2303. /* 128 = restore accent 3 */
  2304. /*   no arguments */
  2305. /* 129 = set accent 3 */
  2306. /*   4-byte little endian large integer coded decimal accent value */
  2307. /* 130 = adjust accent 3 */
  2308. /*   4-byte little endian large integer coded decimal accent adjust */
  2309. /* 131 = sweep accent 3 absolute */
  2310. /*   4-byte little endian large integer coded decimal target accent */
  2311. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2312. /* 132 = sweep accent 3 relative */
  2313. /*   4-byte little endian large integer coded decimal target accent adjust */
  2314. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2315. /* 144 = restore accent 4 */
  2316. /*   no arguments */
  2317. /* 145 = set accent 4 */
  2318. /*   4-byte little endian large integer coded decimal accent value */
  2319. /* 146 = adjust accent 4 */
  2320. /*   4-byte little endian large integer coded decimal accent adjust */
  2321. /* 147 = sweep accent 4 absolute */
  2322. /*   4-byte little endian large integer coded decimal target accent */
  2323. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2324. /* 148 = sweep accent 4 relative */
  2325. /*   4-byte little endian large integer coded decimal target accent adjust */
  2326. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2327. /* 160 = restore pitch displacement depth */
  2328. /*   no arguments */
  2329. /* 161 = set pitch displacement depth */
  2330. /*   4-byte little endian large integer coded decimal pitch disp depth */
  2331. /* 162 = adjust pitch displacement depth */
  2332. /*   4-byte little endian large integer coded decimal pitch disp depth adjust */
  2333. /* 163 = set pitch displacement depth modulation mode */
  2334. /*   1-byte mode flag */
  2335. /*       0 = hertz */
  2336. /*       1 = half steps */
  2337. /*   this command has been eliminated in the version 2 file format */
  2338. /* 164 = sweep pitch displacement depth absolute */
  2339. /*   4-byte little endian large integer coded decimal target pitch disp depth */
  2340. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2341. /* 165 = sweep pitch displacement depth relative */
  2342. /*   4-byte little endian large integer coded decimal target pitch disp depth adjust */
  2343. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2344. /* 176 = restore pitch displacement rate */
  2345. /*   no arguments */
  2346. /* 177 = set pitch displacement rate */
  2347. /*   4-byte little endian large integer coded decimal pitch disp rate */
  2348. /* 178 = adjust pitch displacement rate */
  2349. /*   4-byte little endian large integer coded decimal pitch disp rate adjust */
  2350. /* 179 = sweep pitch displacement rate absolute */
  2351. /*   4-byte little endian large integer coded decimal target pitch disp rate */
  2352. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2353. /* 180 = sweep pitch displacement rate relative */
  2354. /*   4-byte little endian large integer coded decimal target pitch disp rate adjust */
  2355. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2356. /* 192 = restore pitch displacement start point */
  2357. /*   no arguments */
  2358. /* 193 = set pitch displacement start point */
  2359. /*   4-byte little endian large integer coded decimal pitch disp start point */
  2360. /* 194 = adjust pitch displacement start point */
  2361. /*   4-byte little endian large integer coded decimal pitch disp start point adjust */
  2362. /* 195 = set pitch displacement start point origin */
  2363. /*   1-byte start point origin */
  2364. /*       0 = from start */
  2365. /*       1 = from end */
  2366. /* 196 = sweep pitch displacement start point absolute */
  2367. /*   4-byte little endian large integer coded decimal target pitch disp start point */
  2368. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2369. /* 197 = sweep pitch displacement start point relative */
  2370. /*   4-byte little endian large integer coded decimal target pitch disp start adjust */
  2371. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2372. /* 208 = restore hurry-up factor */
  2373. /*   no arguments */
  2374. /* 209 = set hurry-up factor */
  2375. /*   4-byte little endian large integer coded decimal hurry-up factor */
  2376. /* 210 = adjust hurry-up factor */
  2377. /*   4-byte little endian large integer coded decimal hurry-up factor adjust */
  2378. /* 211 = sweep hurry-up factor absolute */
  2379. /*   4-byte little endian large integer coded decimal target hurry-up factor */
  2380. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2381. /* 212 = sweep hurry-up factor relative */
  2382. /*   4-byte little endian large integer coded decimal target hurry-up factor adjust */
  2383. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2384. /* 224 = restore detuning */
  2385. /*   no arguments */
  2386. /* 225 = set detuning */
  2387. /*   4-byte little endian large integer coded decimal detuning */
  2388. /* 226 = adjust detuning */
  2389. /*   4-byte little endian large integer coded decimal detuning adjust */
  2390. /* 227 = set detuning mode */
  2391. /*   1-byte detuning mode specifier */
  2392. /*       0 = hertz */
  2393. /*       1 = half steps */
  2394. /* 228 = sweep detuning absolute */
  2395. /*   4-byte little endian large integer coded decimal target detuning */
  2396. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2397. /* 229 = sweep detuning relative */
  2398. /*   4-byte little endian large integer coded decimal target detuning adjust */
  2399. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2400. /* 240 = restore early/late adjust */
  2401. /*   no arguments */
  2402. /* 241 = set early/late adjust */
  2403. /*   4-byte little endian large integer coded decimal early/late adjust */
  2404. /* 242 = adjust early/late adjust */
  2405. /*   4-byte little endian large integer coded decimal early/late adjust adjustment */
  2406. /* 243 = sweep early/late adjust absolute */
  2407. /*   4-byte little endian large integer coded decimal target early/late adjust */
  2408. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2409. /* 244 = sweep early/late adjust relative */
  2410. /*   4-byte little endian large integer coded decimal target early/late adjust adjust */
  2411. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2412. /* 256 = restore duration adjust */
  2413. /*   no arguments */
  2414. /* 257 = set duration adjust */
  2415. /*   4-byte little endian large integer coded decimal duration adjust */
  2416. /* 258 = adjust duration adjust */
  2417. /*   4-byte little endian large integer coded decimal duration adjust adjustment */
  2418. /* 259 = sweep duration adjust absolute */
  2419. /*   4-byte little endian large integer coded decimal target duration adjust */
  2420. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2421. /* 260 = sweep duration adjust relative */
  2422. /*   4-byte little endian large integer coded decimal target duration adjust adjust */
  2423. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2424. /* 261 = set duration adjust mode */
  2425. /*   1 byte mode flag */
  2426. /*       0 = multiplicative */
  2427. /*       1 = additive */
  2428. /* 272 = set meter */
  2429. /*   4-byte little endian numerator */
  2430. /*   4-byte little endian denominator */
  2431. /* 273 = set measure number */
  2432. /*   4-byte little endian new measure number */
  2433. /* 288 = comment */
  2434. /*   4-byte little endian length of comment text string */
  2435. /*   n-byte comment text string (line feed = 0x0a) */
  2436. /* 304 = restore surround position */
  2437. /*   no arguments */
  2438. /* 305 = set surround position */
  2439. /*   4-byte little endian large integer coded decimal surround position value */
  2440. /*       1 is front, 0 is middle, -1 is rear */
  2441. /* 306 = adjust surround position */
  2442. /*   4-byte little endian large integer coded decimal surround position adjustment */
  2443. /* 307 = sweep surround position absolute */
  2444. /*   4-byte little endian large integer coded decimal target surround position */
  2445. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2446. /* 308 = sweep surround position relative */
  2447. /*   4-byte little endian large integer coded decimal target surround position adjust */
  2448. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2449. /* 320 = set transpose */
  2450. /*   4-byte signed little endian half-step change (<0 decreases pitch) */
  2451. /* 321 = adjust transpose */
  2452. /*   4-byte signed little endian transpose adjustment */
  2453. /* 336 = set effect accent 1 */
  2454. /*   4-byte little endian large integer coded decimal accent value */
  2455. /* 337 = adjust effect accent 1 */
  2456. /*   4-byte little endian large integer coded decimal accent adjust */
  2457. /* 338 = sweep effect accent 1 absolute */
  2458. /*   4-byte little endian large integer coded decimal target accent */
  2459. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2460. /* 339 = sweep effect accent 1 relative */
  2461. /*   4-byte little endian large integer coded decimal target accent adjust */
  2462. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2463. /* 352 = set effect accent 2 */
  2464. /*   4-byte little endian large integer coded decimal accent value */
  2465. /* 353 = adjust effect accent 2 */
  2466. /*   4-byte little endian large integer coded decimal accent adjust */
  2467. /* 354 = sweep effect accent 2 absolute */
  2468. /*   4-byte little endian large integer coded decimal target accent */
  2469. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2470. /* 355 = sweep effect accent 2 relative */
  2471. /*   4-byte little endian large integer coded decimal target accent adjust */
  2472. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2473. /* 368 = set effect accent 3 */
  2474. /*   4-byte little endian large integer coded decimal accent value */
  2475. /* 369 = adjust effect accent 3 */
  2476. /*   4-byte little endian large integer coded decimal accent adjust */
  2477. /* 370 = sweep effect accent 3 absolute */
  2478. /*   4-byte little endian large integer coded decimal target accent */
  2479. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2480. /* 371 = sweep effect accent 3 relative */
  2481. /*   4-byte little endian large integer coded decimal target accent adjust */
  2482. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2483. /* 384 = set effect accent 4 */
  2484. /*   4-byte little endian large integer coded decimal accent value */
  2485. /* 385 = adjust effect accent 4 */
  2486. /*   4-byte little endian large integer coded decimal accent adjust */
  2487. /* 386 = sweep effect accent 4 absolute */
  2488. /*   4-byte little endian large integer coded decimal target accent */
  2489. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2490. /* 387 = sweep effect accent 4 relative */
  2491. /*   4-byte little endian large integer coded decimal target accent adjust */
  2492. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2493. /* 400 = set global score effect accent 1 */
  2494. /*   4-byte little endian large integer coded decimal accent value */
  2495. /* 401 = adjust global score effect accent 1 */
  2496. /*   4-byte little endian large integer coded decimal accent adjust */
  2497. /* 402 = sweep global score effect accent 1 absolute */
  2498. /*   4-byte little endian large integer coded decimal target accent */
  2499. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2500. /* 403 = sweep global score effect accent 1 relative */
  2501. /*   4-byte little endian large integer coded decimal target accent adjust */
  2502. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2503. /* 416 = set global score effect accent 2 */
  2504. /*   4-byte little endian large integer coded decimal accent value */
  2505. /* 417 = adjust global score effect accent 2 */
  2506. /*   4-byte little endian large integer coded decimal accent adjust */
  2507. /* 418 = sweep global score effect accent 2 absolute */
  2508. /*   4-byte little endian large integer coded decimal target accent */
  2509. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2510. /* 419 = sweep global score effect accent 2 relative */
  2511. /*   4-byte little endian large integer coded decimal target accent adjust */
  2512. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2513. /* 432 = set global score effect accent 3 */
  2514. /*   4-byte little endian large integer coded decimal accent value */
  2515. /* 433 = adjust global score effect accent 3 */
  2516. /*   4-byte little endian large integer coded decimal accent adjust */
  2517. /* 434 = sweep global score effect accent 3 absolute */
  2518. /*   4-byte little endian large integer coded decimal target accent */
  2519. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2520. /* 435 = sweep global score effect accent 3 relative */
  2521. /*   4-byte little endian large integer coded decimal target accent adjust */
  2522. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2523. /* 448 = set global score effect accent 4 */
  2524. /*   4-byte little endian large integer coded decimal accent value */
  2525. /* 449 = adjust global score effect accent 4 */
  2526. /*   4-byte little endian large integer coded decimal accent adjust */
  2527. /* 450 = sweep global score effect accent 4 absolute */
  2528. /*   4-byte little endian large integer coded decimal target accent */
  2529. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2530. /* 451 = sweep global score effect accent 4 relative */
  2531. /*   4-byte little endian large integer coded decimal target accent adjust */
  2532. /*   4-byte little endian extended integer coded decimal number of beats to reach it */
  2533. /* 464 = track effects switch */
  2534. /*   1 byte mode flag */
  2535. /*       1 = disable */
  2536. /*       0 = enable */
  2537.  
  2538.  
  2539. /* read a note object in from a file.  this does not handle ties since they */
  2540. /* are done separately. */
  2541. FileLoadingErrors            NoteObjectNewFromFile(NoteObjectRec** ObjectOut,
  2542.                                                 struct BufferedInputRec* Input, short FormatVersionNumber)
  2543.     {
  2544.         NoteObjectRec*            Note;
  2545.         FileLoadingErrors        Error;
  2546.  
  2547.         CheckPtrExistence(Input);
  2548.  
  2549.         Note = (NoteObjectRec*)AllocPtrCanFail(sizeof(NoteObjectRec),"NoteObjectRec");
  2550.         if (Note == NIL)
  2551.             {
  2552.                 Error = eFileLoadOutOfMemory;
  2553.              FailurePoint1:
  2554.                 return Error;
  2555.             }
  2556.  
  2557.         /*   4-byte unsigned little endian opcode field */
  2558.         /*       for a command, the high bit will be 1 and the remaining bits will */
  2559.         /*       be the opcode.  for a note, the high bit will be 0. */
  2560.         if (!ReadBufferedUnsignedLongLittleEndian(Input,&(Note->Flags)))
  2561.             {
  2562.                 Error = eFileLoadDiskError;
  2563.              FailurePoint2:
  2564.                 ReleasePtr((char*)Note);
  2565.                 goto FailurePoint1;
  2566.             }
  2567.  
  2568.         if ((Note->Flags & eCommandFlag) == 0)
  2569.             {
  2570.                 signed short                SignedShort;
  2571.  
  2572.                 /* it's a note */
  2573.  
  2574.                 /* check opcode flags for validity */
  2575.                 if ((((Note->Flags & eDurationMask) != e64thNote)
  2576.                         && ((Note->Flags & eDurationMask) != e32ndNote)
  2577.                         && ((Note->Flags & eDurationMask) != e16thNote)
  2578.                         && ((Note->Flags & eDurationMask) != e8thNote)
  2579.                         && ((Note->Flags & eDurationMask) != e4thNote)
  2580.                         && ((Note->Flags & eDurationMask) != e2ndNote)
  2581.                         && ((Note->Flags & eDurationMask) != eWholeNote)
  2582.                         && ((Note->Flags & eDurationMask) != eDoubleNote)
  2583.                         && ((Note->Flags & eDurationMask) != eQuadNote))
  2584.                     ||
  2585.                         (((Note->Flags & eFlatModifier) != 0)
  2586.                         && ((Note->Flags & eSharpModifier) != 0))
  2587.                     ||
  2588.                         (((Note->Flags & eRelease1OriginMask) != eRelease1FromDefault)
  2589.                         && ((Note->Flags & eRelease1OriginMask) != eRelease1FromStart)
  2590.                         && ((Note->Flags & eRelease1OriginMask) != eRelease1FromEnd))
  2591.                     ||
  2592.                         (((Note->Flags & eRelease2OriginMask) != eRelease2FromDefault)
  2593.                         && ((Note->Flags & eRelease2OriginMask) != eRelease2FromStart)
  2594.                         && ((Note->Flags & eRelease2OriginMask) != eRelease2FromEnd))
  2595.                     ||
  2596.                         (((Note->Flags & ePitchDisplacementStartOriginMask)
  2597.                             != ePitchDisplacementStartFromDefault)
  2598.                         && ((Note->Flags & ePitchDisplacementStartOriginMask)
  2599.                             != ePitchDisplacementStartFromStart)
  2600.                         && ((Note->Flags & ePitchDisplacementStartOriginMask)
  2601.                             != ePitchDisplacementStartFromEnd))
  2602.                     ||
  2603.                         (((Note->Flags & eDetuningModeMask) != eDetuningModeDefault)
  2604.                         && ((Note->Flags & eDetuningModeMask) != eDetuningModeHalfSteps)
  2605.                         && ((Note->Flags & eDetuningModeMask) != eDetuningModeHertz))
  2606.                     ||
  2607.                         (((Note->Flags & eDurationAdjustMask) != eDurationAdjustDefault)
  2608.                         && ((Note->Flags & eDurationAdjustMask) != eDurationAdjustAdditive)
  2609.                         && ((Note->Flags & eDurationAdjustMask) != eDurationAdjustMultiplicative))
  2610.                     ||
  2611.                         /* we do NOT check former pitch LFO bits, since someone may have used them */
  2612.                         /* unless we are not in the version 1 file format */
  2613.                         ((FormatVersionNumber == 1) && ((Note->Flags & eUnusedBitMask) != 0))
  2614.                     ||
  2615.                         ((FormatVersionNumber != 1) && ((Note->Flags
  2616.                             & (eUnusedBitMask | eDEALLOCATED17 | eDEALLOCATED18)) != 0)))
  2617.                     {
  2618.                      FailurePointNoteBadFormat:
  2619.                         Error = eFileLoadBadFormat;
  2620.                         goto FailurePoint2;
  2621.                     }
  2622.                 /* this removes former pitch LFO bits */
  2623.                 Note->Flags = Note->Flags & ~(eDEALLOCATED17 | eDEALLOCATED18);
  2624.  
  2625.                 /*   2-byte signed little endian pitch index */
  2626.                 /*       should be a value in the range 0..383.  Middle C (261.6 Hertz) = 192 */
  2627.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2628.                     {
  2629.                      FailurePointNoteDiskError:
  2630.                         Error = eFileLoadDiskError;
  2631.                         goto FailurePoint2;
  2632.                     }
  2633.                 if ((SignedShort < 0) || (SignedShort >= NUMNOTES))
  2634.                     {
  2635.                         goto FailurePointNoteBadFormat;
  2636.                     }
  2637.                 Note->a.Note.Pitch = SignedShort;
  2638.  
  2639.                 /*   2-byte little endian small integer coded decimal portamento duration. */
  2640.                 /*       this determines how long a portamento will last, in fractions of a quarter */
  2641.                 /*       note.  it only has effect if the note is the target of a tie.  a value of */
  2642.                 /*       0 means instantaneous, i.e. no portamento. */
  2643.                 /*       A small integer coded decimal is the decimal * 1000 with a range */
  2644.                 /*       of -29.999 to 29.999 */
  2645.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2646.                     {
  2647.                         goto FailurePointNoteDiskError;
  2648.                     }
  2649.                 Note->a.Note.PortamentoDuration = SignedShort;
  2650.  
  2651.                 /*   2-byte little endian small integer coded decimal early/late adjustment */
  2652.                 /*       this determines the displacement in time of the occurrence of the note */
  2653.                 /*       in frations of a quarter note. */
  2654.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2655.                     {
  2656.                         goto FailurePointNoteDiskError;
  2657.                     }
  2658.                 Note->a.Note.EarlyLateAdjust = SignedShort;
  2659.  
  2660.                 /*   2-byte little endian small integer coded decimal duration adjustment */
  2661.                 /*       this value changes the duration of the note by being added to the */
  2662.                 /*       duration or being multiplied by the duration. */
  2663.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2664.                     {
  2665.                         goto FailurePointNoteDiskError;
  2666.                     }
  2667.                 Note->a.Note.DurationAdjust = SignedShort;
  2668.  
  2669.                 Note->a.Note.Tie = NIL;
  2670.  
  2671.                 /*   2-byte little endian small integer coded decimal release point 1 location */
  2672.                 /*       this determines when the release of the first sustain/loop will occur */
  2673.                 /*       in fractions of the current note's duration.  it is relative to the origin */
  2674.                 /*       as determined by the opcode field. */
  2675.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2676.                     {
  2677.                         goto FailurePointNoteDiskError;
  2678.                     }
  2679.                 Note->a.Note.ReleasePoint1 = SignedShort;
  2680.  
  2681.                 /*   2-byte little endian small integer coded decimal release point 2 location */
  2682.                 /*       this determines when the release of the second sustain/loop will occur. */
  2683.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2684.                     {
  2685.                         goto FailurePointNoteDiskError;
  2686.                     }
  2687.                 Note->a.Note.ReleasePoint2 = SignedShort;
  2688.  
  2689.                 /*   2-byte little endian small integer coded decimal overall loudness adjustment */
  2690.                 /*       this factor scales the total volume output of the oscillators for this */
  2691.                 /*       particular note.  It is multiplied, so a value of 1 makes no change in */
  2692.                 /*       loudness. */
  2693.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2694.                     {
  2695.                         goto FailurePointNoteDiskError;
  2696.                     }
  2697.                 Note->a.Note.OverallLoudnessAdjustment = SignedShort;
  2698.  
  2699.                 /*   2-byte little endian small integer coded decimal stereo position adjustment. */
  2700.                 /*       this value adjusts where the sound will be located in stereo.  -1 is */
  2701.                 /*       the far left, 1 is the far right, and 0 is center. */
  2702.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2703.                     {
  2704.                         goto FailurePointNoteDiskError;
  2705.                     }
  2706.                 Note->a.Note.StereoPositionAdjustment = SignedShort;
  2707.  
  2708.                 /*   2-byte little endian small integer coded decimal surround position adjustment. */
  2709.                 /*       this value adjusts where the sound will be located in surround. */
  2710.                 /*       1 is front and -1 is rear. */
  2711.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2712.                     {
  2713.                         goto FailurePointNoteDiskError;
  2714.                     }
  2715.                 Note->a.Note.SurroundPositionAdjustment = SignedShort;
  2716.  
  2717.                 /*   2-byte little endian small integer coded decimal accent 1 value */
  2718.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2719.                     {
  2720.                         goto FailurePointNoteDiskError;
  2721.                     }
  2722.                 Note->a.Note.Accent1 = SignedShort;
  2723.  
  2724.                 /*   2-byte little endian small integer coded decimal accent 2 value */
  2725.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2726.                     {
  2727.                         goto FailurePointNoteDiskError;
  2728.                     }
  2729.                 Note->a.Note.Accent2 = SignedShort;
  2730.  
  2731.                 /*   2-byte little endian small integer coded decimal accent 3 value */
  2732.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2733.                     {
  2734.                         goto FailurePointNoteDiskError;
  2735.                     }
  2736.                 Note->a.Note.Accent3 = SignedShort;
  2737.  
  2738.                 /*   2-byte little endian small integer coded decimal accent 4 value */
  2739.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2740.                     {
  2741.                         goto FailurePointNoteDiskError;
  2742.                     }
  2743.                 Note->a.Note.Accent4 = SignedShort;
  2744.  
  2745.                 /*   2-byte little endian fake pitch value */
  2746.                 /*       this value has a range of -1..383.  If it is not -1, then it will be used */
  2747.                 /*       to determine which sample a multisampled oscillator will use.  If it is -1 */
  2748.                 /*       then the actual pitch will be used to select a sample. */
  2749.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2750.                     {
  2751.                         goto FailurePointNoteDiskError;
  2752.                     }
  2753.                 if ((SignedShort < -1) || (SignedShort >= NUMNOTES))
  2754.                     {
  2755.                         goto FailurePointNoteBadFormat;
  2756.                     }
  2757.                 Note->a.Note.MultisamplePitchAsIf = SignedShort;
  2758.  
  2759.                 /*   2-byte little endian small integer coded decimal pitch disp depth adjustment */
  2760.                 /*       this adjusts the maximum amplitude of the pitch displacement depth */
  2761.                 /*       oscillator (vibrato).  The value has units of either half steps or hertz */
  2762.                 /*       depending on the setting in the opcode word. */
  2763.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2764.                     {
  2765.                         goto FailurePointNoteDiskError;
  2766.                     }
  2767.                 Note->a.Note.PitchDisplacementDepthAdjustment = SignedShort;
  2768.  
  2769.                 /*   2-byte little endian small integer coded decimal pitch displ rate adjustment */
  2770.                 /*       this adjusts the maximum amplitude of the pitch displacement rate */
  2771.                 /*       oscillator. the units are periods per second. */
  2772.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2773.                     {
  2774.                         goto FailurePointNoteDiskError;
  2775.                     }
  2776.                 Note->a.Note.PitchDisplacementRateAdjustment = SignedShort;
  2777.  
  2778.                 /*   2-byte little endian small integer coded decimal pitch displ start point adjust */
  2779.                 /*       this value adjusts when the pitch displacement envelopes start.  the */
  2780.                 /*       location is from start or end of note, depending on the opcode settings, and */
  2781.                 /*       is in fractions of the current note's duration. */
  2782.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2783.                     {
  2784.                         goto FailurePointNoteDiskError;
  2785.                     }
  2786.                 Note->a.Note.PitchDisplacementStartPoint = SignedShort;
  2787.  
  2788.                 /*   2-byte little endian small integer coded decimal hurry-up factor */
  2789.                 /*       this factor scales the total speed at which all envelopes change.  this is */
  2790.                 /*       multiplicative, so a value of 1 makes no change, and smaller values make */
  2791.                 /*       transitions go faster. */
  2792.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2793.                     {
  2794.                         goto FailurePointNoteDiskError;
  2795.                     }
  2796.                 Note->a.Note.HurryUpFactor = SignedShort;
  2797.  
  2798.                 /*   2-byte little endian small integer coded decimal detuning value */
  2799.                 /*       this value is added to the pitch of the note to detune.  its units are */
  2800.                 /*       either hertz or half steps depending on the opcode word. */
  2801.                 if (!ReadBufferedSignedShortLittleEndian(Input,&SignedShort))
  2802.                     {
  2803.                         goto FailurePointNoteDiskError;
  2804.                     }
  2805.                 Note->a.Note.Detuning = SignedShort;
  2806.             }
  2807.          else
  2808.             {
  2809.                 signed long                    SignedLong;
  2810.                 unsigned char                UnsignedChar;
  2811.  
  2812.                 /* it's a command; clear out the operand fields to begin with */
  2813.                 Note->a.Command.StringArgument = AllocPtrCanFail(0,
  2814.                     "NoteObjectRec:  command string argument");
  2815.                 if (Note->a.Command.StringArgument == NIL)
  2816.                     {
  2817.                         Error = eFileLoadOutOfMemory;
  2818.                         goto FailurePoint2;
  2819.                     }
  2820.                 Note->a.Command.Argument1 = 0;
  2821.                 Note->a.Command.Argument2 = 0;
  2822.                 Note->a.Command.Argument3 = 0;
  2823.  
  2824.                 /* read in operands */
  2825.                 switch (Note->Flags & ~eCommandFlag)
  2826.                     {
  2827.                         default:
  2828.                             Error = eFileLoadBadFormat;
  2829.                          FailurePoint3:
  2830.                             ReleasePtr(Note->a.Command.StringArgument);
  2831.                             goto FailurePoint2;
  2832.  
  2833.                         /*   no arguments */
  2834.                         case 16: /* 16 = restore tempo */
  2835.                         case 32: /* 32 = restore stereo position */
  2836.                         case 48: /* 48 = restore volume */
  2837.                         case 64: /* 64 = restore release point 1 */
  2838.                         case 80: /* 80 = restore release point 2 */
  2839.                         case 96: /* 96 = restore accent 1 */
  2840.                         case 112: /* 112 = restore accent 2 */
  2841.                         case 128: /* 128 = restore accent 3 */
  2842.                         case 144: /* 144 = restore accent 4 */
  2843.                         case 160: /* 160 = restore pitch displacement depth */
  2844.                         case 176: /* 176 = restore pitch displacement rate */
  2845.                         case 192: /* 192 = restore pitch displacement start point */
  2846.                         case 208: /* 208 = restore hurry-up factor */
  2847.                         case 224: /* 224 = restore detuning */
  2848.                         case 240: /* 240 = restore early/late adjust */
  2849.                         case 256: /* 256 = restore duration adjust */
  2850.                         case 304: /* 304 = restore surround position */
  2851.                             break;
  2852.  
  2853.                         /*   4-byte little endian large/extended integer coded decimal */
  2854.                         case 17: /* 17 = set tempo */
  2855.                         case 18: /* 18 = adjust tempo */
  2856.                         case 33: /* 33 = set stereo position */
  2857.                         case 34: /* 34 = adjust stereo position */
  2858.                         case 49: /* 49 = set volume */
  2859.                         case 50: /* 50 = adjust volume */
  2860.                         case 65: /* 65 = set release point 1 */
  2861.                         case 66: /* 66 = adjust release point 1 */
  2862.                         case 81: /* 81 = set release point 2 */
  2863.                         case 82: /* 82 = adjust release point 2 */
  2864.                         case 97: /* 97 = set accent 1 */
  2865.                         case 98: /* 98 = adjust accent 1 */
  2866.                         case 113: /* 113 = set accent 2 */
  2867.                         case 114: /* 114 = adjust accent 2 */
  2868.                         case 129: /* 129 = set accent 3 */
  2869.                         case 130: /* 130 = adjust accent 3 */
  2870.                         case 145: /* 145 = set accent 4 */
  2871.                         case 146: /* 146 = adjust accent 4 */
  2872.                         case 161: /* 161 = set pitch displacement depth */
  2873.                         case 162: /* 162 = adjust pitch displacement depth */
  2874.                         case 177: /* 177 = set pitch displacement rate */
  2875.                         case 178: /* 178 = adjust pitch displacement rate */
  2876.                         case 193: /* 193 = set pitch displacement start point */
  2877.                         case 194: /* 194 = adjust pitch displacement start point */
  2878.                         case 209: /* 209 = set hurry-up factor */
  2879.                         case 210: /* 210 = adjust hurry-up factor */
  2880.                         case 225: /* 225 = set detuning */
  2881.                         case 226: /* 226 = adjust detuning */
  2882.                         case 241: /* 241 = set early/late adjust */
  2883.                         case 242: /* 242 = adjust early/late adjust */
  2884.                         case 257: /* 257 = set duration adjust */
  2885.                         case 258: /* 258 = adjust duration adjust */
  2886.                         case 273: /* 273 = set measure number */
  2887.                         case 305: /* 305 = set surround position */
  2888.                         case 306: /* 306 = adjust surround position */
  2889.                         case 320: /* 320 = set transpose */
  2890.                         case 321: /* 321 = adjust transpose */
  2891.                         case 336: /* 336 = set effect accent 1 */
  2892.                         case 337: /* 337 = adjust effect accent 1 */
  2893.                         case 352: /* 352 = set effect accent 2 */
  2894.                         case 353: /* 353 = adjust effect accent 2 */
  2895.                         case 368: /* 368 = set effect accent 3 */
  2896.                         case 369: /* 369 = adjust effect accent 3 */
  2897.                         case 384: /* 384 = set effect accent 4 */
  2898.                         case 385: /* 385 = adjust effect accent 4 */
  2899.                         case 400: /* 400 = set global score effect accent 1 */
  2900.                         case 401: /* 401 = adjust global score effect accent 1 */
  2901.                         case 416: /* 416 = set global score effect accent 2 */
  2902.                         case 417: /* 417 = adjust global score effect accent 2 */
  2903.                         case 432: /* 432 = set global score effect accent 3 */
  2904.                         case 433: /* 433 = adjust global score effect accent 3 */
  2905.                         case 448: /* 448 = set global score effect accent 4 */
  2906.                         case 449: /* 449 = adjust global score effect accent 4 */
  2907.                             if (!ReadBufferedSignedLongLittleEndian(Input,&SignedLong))
  2908.                                 {
  2909.                                     Error = eFileLoadDiskError;
  2910.                                     goto FailurePoint3;
  2911.                                 }
  2912.                             Note->a.Command.Argument1 = SignedLong;
  2913.                             break;
  2914.  
  2915.                         /*   4-byte little endian large/extended integer coded decimal */
  2916.                         /*   4-byte little endian large/extended integer coded decimal */
  2917.                         case 19: /* 19 = sweep tempo absolute */
  2918.                         case 20: /* 20 = sweep tempo relative */
  2919.                         case 35: /* 35 = sweep stereo position absolute */
  2920.                         case 36: /* 36 = sweep stereo position relative */
  2921.                         case 51: /* 51 = sweep volume absolute */
  2922.                         case 52: /* 52 = sweep volume relative */
  2923.                         case 68: /* 68 = sweep release point 1 absolute */
  2924.                         case 69: /* 69 = sweep release point 1 relative */
  2925.                         case 84: /* 84 = sweep release point 2 absolute */
  2926.                         case 85: /* 85 = sweep release point 2 relative */
  2927.                         case 99: /* 99 = sweep accent 1 absolute */
  2928.                         case 100: /* 100 = sweep accent 1 relative */
  2929.                         case 115: /* 115 = sweep accent 2 absolute */
  2930.                         case 116: /* 116 = sweep accent 2 relative */
  2931.                         case 131: /* 131 = sweep accent 3 absolute */
  2932.                         case 132: /* 132 = sweep accent 3 relative */
  2933.                         case 147: /* 147 = sweep accent 4 absolute */
  2934.                         case 148: /* 148 = sweep accent 4 relative */
  2935.                         case 164: /* 164 = sweep pitch displacement depth absolute */
  2936.                         case 165: /* 165 = sweep pitch displacement depth relative */
  2937.                         case 179: /* 179 = sweep pitch displacement rate absolute */
  2938.                         case 180: /* 180 = sweep pitch displacement rate relative */
  2939.                         case 196: /* 196 = sweep pitch displacement start point absolute */
  2940.                         case 197: /* 197 = sweep pitch displacement start point relative */
  2941.                         case 211: /* 211 = sweep hurry-up factor absolute */
  2942.                         case 212: /* 212 = sweep hurry-up factor relative */
  2943.                         case 228: /* 228 = sweep detuning absolute */
  2944.                         case 229: /* 229 = sweep detuning relative */
  2945.                         case 243: /* 243 = sweep early/late adjust absolute */
  2946.                         case 244: /* 244 = sweep early/late adjust relative */
  2947.                         case 259: /* 259 = sweep duration adjust absolute */
  2948.                         case 260: /* 260 = sweep duration adjust relative */
  2949.                         case 272: /* 272 = set meter */
  2950.                         case 307: /* 307 = sweep surround position absolute */
  2951.                         case 308: /* 308 = sweep surround position relative */
  2952.                         case 338: /* 338 = sweep effect accent 1 absolute */
  2953.                         case 339: /* 339 = sweep effect accent 1 relative */
  2954.                         case 354: /* 354 = sweep effect accent 2 absolute */
  2955.                         case 355: /* 355 = sweep effect accent 2 relative */
  2956.                         case 370: /* 370 = sweep effect accent 3 absolute */
  2957.                         case 371: /* 371 = sweep effect accent 3 relative */
  2958.                         case 386: /* 386 = sweep effect accent 4 absolute */
  2959.                         case 387: /* 387 = sweep effect accent 4 relative */
  2960.                         case 402: /* 402 = sweep global score effect accent 1 absolute */
  2961.                         case 403: /* 403 = sweep global score effect accent 1 relative */
  2962.                         case 418: /* 418 = sweep global score effect accent 2 absolute */
  2963.                         case 419: /* 419 = sweep global score effect accent 2 relative */
  2964.                         case 434: /* 434 = sweep global score effect accent 3 absolute */
  2965.                         case 435: /* 435 = sweep global score effect accent 3 relative */
  2966.                         case 450: /* 450 = sweep global score effect accent 4 absolute */
  2967.                         case 451: /* 451 = sweep global score effect accent 4 relative */
  2968.                             if (!ReadBufferedSignedLongLittleEndian(Input,&SignedLong))
  2969.                                 {
  2970.                                     Error = eFileLoadDiskError;
  2971.                                     goto FailurePoint3;
  2972.                                 }
  2973.                             Note->a.Command.Argument1 = SignedLong;
  2974.                             if (!ReadBufferedSignedLongLittleEndian(Input,&SignedLong))
  2975.                                 {
  2976.                                     Error = eFileLoadDiskError;
  2977.                                     goto FailurePoint3;
  2978.                                 }
  2979.                             Note->a.Command.Argument2 = SignedLong;
  2980.                             break;
  2981.  
  2982.                         /*   1-byte origin specifier */
  2983.                         /*       0 = -1 */
  2984.                         /*       1 = 0 */
  2985.                         /* 163 has been eliminated in the version 2 file format */
  2986.                         case 163: /* 163 = set pitch displacement depth modulation mode */
  2987.                             if (FormatVersionNumber == 1)
  2988.                                 {
  2989.                                     if (!ReadBufferedUnsignedChar(Input,&UnsignedChar))
  2990.                                         {
  2991.                                             Error = eFileLoadDiskError;
  2992.                                             goto FailurePoint3;
  2993.                                         }
  2994.                                 }
  2995.                              else
  2996.                                 {
  2997.                                     Error = eFileLoadBadFormat;
  2998.                                     goto FailurePoint3;
  2999.                                 }
  3000.                             break;
  3001.  
  3002.                         /*   1-byte origin specifier */
  3003.                         /*       0 = -1 */
  3004.                         /*       1 = 0 */
  3005.                         case 67: /* 67 = set release point 1 origin */
  3006.                         case 83: /* 83 = set release point 2 origin */
  3007.                         case 195: /* 195 = set pitch displacement start point origin */
  3008.                         case 227: /* 227 = set detuning mode */
  3009.                         case 261: /* 261 = set duration adjust mode */
  3010.                         case 464: /* 464 = track effects switch */
  3011.                             if (!ReadBufferedUnsignedChar(Input,&UnsignedChar))
  3012.                                 {
  3013.                                     Error = eFileLoadDiskError;
  3014.                                     goto FailurePoint3;
  3015.                                 }
  3016.                             if (UnsignedChar == 0)
  3017.                                 {
  3018.                                     Note->a.Command.Argument1 = -1;
  3019.                                 }
  3020.                             else if (UnsignedChar == 1)
  3021.                                 {
  3022.                                     Note->a.Command.Argument1 = 0;
  3023.                                 }
  3024.                             else
  3025.                                 {
  3026.                                     Error = eFileLoadBadFormat;
  3027.                                     goto FailurePoint3;
  3028.                                 }
  3029.                             break;
  3030.  
  3031.                         /*   4-byte little endian length of comment text string */
  3032.                         /*   n-byte comment text string (line feed = 0x0a) */
  3033.                         case 288: /* 288 = comment */
  3034.                             if (!ReadBufferedSignedLongLittleEndian(Input,&SignedLong))
  3035.                                 {
  3036.                                     Error = eFileLoadDiskError;
  3037.                                     goto FailurePoint3;
  3038.                                 }
  3039.                             if (SignedLong < 0)
  3040.                                 {
  3041.                                     Error = eFileLoadBadFormat;
  3042.                                     goto FailurePoint3;
  3043.                                 }
  3044.                             {
  3045.                                 char*                            TempString;
  3046.  
  3047.                                 TempString = AllocPtrCanFail(SignedLong,"NoteObjectRec:  command string argument");
  3048.                                 if (TempString == NIL)
  3049.                                     {
  3050.                                         Error = eFileLoadOutOfMemory;
  3051.                                         goto FailurePoint3;
  3052.                                     }
  3053.                                 ReleasePtr(Note->a.Command.StringArgument);
  3054.                                 Note->a.Command.StringArgument = TempString;
  3055.                             }
  3056.                             if (!ReadBufferedInput(Input,SignedLong,Note->a.Command.StringArgument))
  3057.                                 {
  3058.                                     Error = eFileLoadDiskError;
  3059.                                     goto FailurePoint3;
  3060.                                 }
  3061.                             break;
  3062.                     }
  3063.  
  3064.                 /* convert file format opcode to internal enumeration value */
  3065.                 switch (Note->Flags & ~eCommandFlag)
  3066.                     {
  3067.                         default:
  3068.                             EXECUTE(PRERR(ForceAbort,
  3069.                                 "NoteObjectNewFromFile:  command opcode filter failure"));
  3070.                             break;
  3071.                         case 16: /* 16 = restore tempo */
  3072.                             Note->Flags = eCmdRestoreTempo;
  3073.                             break;
  3074.                         case 17: /* 17 = set tempo */
  3075.                             Note->Flags = eCmdSetTempo;
  3076.                             break;
  3077.                         case 18: /* 18 = adjust tempo */
  3078.                             Note->Flags = eCmdIncTempo;
  3079.                             break;
  3080.                         case 19: /* 19 = sweep tempo absolute */
  3081.                             Note->Flags = eCmdSweepTempoAbs;
  3082.                             break;
  3083.                         case 20: /* 20 = sweep tempo relative */
  3084.                             Note->Flags = eCmdSweepTempoRel;
  3085.                             break;
  3086.                         case 32: /* 32 = restore stereo position */
  3087.                             Note->Flags = eCmdRestoreStereoPosition;
  3088.                             break;
  3089.                         case 33: /* 33 = set stereo position */
  3090.                             Note->Flags = eCmdSetStereoPosition;
  3091.                             break;
  3092.                         case 34: /* 34 = adjust stereo position */
  3093.                             Note->Flags = eCmdIncStereoPosition;
  3094.                             break;
  3095.                         case 35: /* 35 = sweep stereo position absolute */
  3096.                             Note->Flags = eCmdSweepStereoAbs;
  3097.                             break;
  3098.                         case 36: /* 36 = sweep stereo position relative */
  3099.                             Note->Flags = eCmdSweepStereoRel;
  3100.                             break;
  3101.                         case 48: /* 48 = restore volume */
  3102.                             Note->Flags = eCmdRestoreVolume;
  3103.                             break;
  3104.                         case 49: /* 49 = set volume */
  3105.                             Note->Flags = eCmdSetVolume;
  3106.                             break;
  3107.                         case 50: /* 50 = adjust volume */
  3108.                             Note->Flags = eCmdIncVolume;
  3109.                             break;
  3110.                         case 51: /* 51 = sweep volume absolute */
  3111.                             Note->Flags = eCmdSweepVolumeAbs;
  3112.                             break;
  3113.                         case 52: /* 52 = sweep volume relative */
  3114.                             Note->Flags = eCmdSweepVolumeRel;
  3115.                             break;
  3116.                         case 64: /* 64 = restore release point 1 */
  3117.                             Note->Flags = eCmdRestoreReleasePoint1;
  3118.                             break;
  3119.                         case 65: /* 65 = set release point 1 */
  3120.                             Note->Flags = eCmdSetReleasePoint1;
  3121.                             break;
  3122.                         case 66: /* 66 = adjust release point 1 */
  3123.                             Note->Flags = eCmdIncReleasePoint1;
  3124.                             break;
  3125.                         case 67: /* 67 = set release point 1 origin */
  3126.                             Note->Flags = eCmdReleasePointOrigin1;
  3127.                             break;
  3128.                         case 68: /* 68 = sweep release point 1 absolute */
  3129.                             Note->Flags = eCmdSweepReleaseAbs1;
  3130.                             break;
  3131.                         case 69: /* 69 = sweep release point 1 relative */
  3132.                             Note->Flags = eCmdSweepReleaseRel1;
  3133.                             break;
  3134.                         case 80: /* 80 = restore release point 2 */
  3135.                             Note->Flags = eCmdRestoreReleasePoint2;
  3136.                             break;
  3137.                         case 81: /* 81 = set release point 2 */
  3138.                             Note->Flags = eCmdSetReleasePoint2;
  3139.                             break;
  3140.                         case 82: /* 82 = adjust release point 2 */
  3141.                             Note->Flags = eCmdIncReleasePoint2;
  3142.                             break;
  3143.                         case 83: /* 83 = set release point 2 origin */
  3144.                             Note->Flags = eCmdReleasePointOrigin2;
  3145.                             break;
  3146.                         case 84: /* 84 = sweep release point 2 absolute */
  3147.                             Note->Flags = eCmdSweepReleaseAbs2;
  3148.                             break;
  3149.                         case 85: /* 85 = sweep release point 2 relative */
  3150.                             Note->Flags = eCmdSweepReleaseRel2;
  3151.                             break;
  3152.                         case 96: /* 96 = restore accent 1 */
  3153.                             Note->Flags = eCmdRestoreAccent1;
  3154.                             break;
  3155.                         case 97: /* 97 = set accent 1 */
  3156.                             Note->Flags = eCmdSetAccent1;
  3157.                             break;
  3158.                         case 98: /* 98 = adjust accent 1 */
  3159.                             Note->Flags = eCmdIncAccent1;
  3160.                             break;
  3161.                         case 99: /* 99 = sweep accent 1 absolute */
  3162.                             Note->Flags = eCmdSweepAccentAbs1;
  3163.                             break;
  3164.                         case 100: /* 100 = sweep accent 1 relative */
  3165.                             Note->Flags = eCmdSweepAccentRel1;
  3166.                             break;
  3167.                         case 112: /* 112 = restore accent 2 */
  3168.                             Note->Flags = eCmdRestoreAccent2;
  3169.                             break;
  3170.                         case 113: /* 113 = set accent 2 */
  3171.                             Note->Flags = eCmdSetAccent2;
  3172.                             break;
  3173.                         case 114: /* 114 = adjust accent 2 */
  3174.                             Note->Flags = eCmdIncAccent2;
  3175.                             break;
  3176.                         case 115: /* 115 = sweep accent 2 absolute */
  3177.                             Note->Flags = eCmdSweepAccentAbs2;
  3178.                             break;
  3179.                         case 116: /* 116 = sweep accent 2 relative */
  3180.                             Note->Flags = eCmdSweepAccentRel2;
  3181.                             break;
  3182.                         case 128: /* 128 = restore accent 3 */
  3183.                             Note->Flags = eCmdRestoreAccent3;
  3184.                             break;
  3185.                         case 129: /* 129 = set accent 3 */
  3186.                             Note->Flags = eCmdSetAccent3;
  3187.                             break;
  3188.                         case 130: /* 130 = adjust accent 3 */
  3189.                             Note->Flags = eCmdIncAccent3;
  3190.                             break;
  3191.                         case 131: /* 131 = sweep accent 3 absolute */
  3192.                             Note->Flags = eCmdSweepAccentAbs3;
  3193.                             break;
  3194.                         case 132: /* 132 = sweep accent 3 relative */
  3195.                             Note->Flags = eCmdSweepAccentRel3;
  3196.                             break;
  3197.                         case 144: /* 144 = restore accent 4 */
  3198.                             Note->Flags = eCmdRestoreAccent4;
  3199.                             break;
  3200.                         case 145: /* 145 = set accent 4 */
  3201.                             Note->Flags = eCmdSetAccent4;
  3202.                             break;
  3203.                         case 146: /* 146 = adjust accent 4 */
  3204.                             Note->Flags = eCmdIncAccent4;
  3205.                             break;
  3206.                         case 147: /* 147 = sweep accent 4 absolute */
  3207.                             Note->Flags = eCmdSweepAccentAbs4;
  3208.                             break;
  3209.                         case 148: /* 148 = sweep accent 4 relative */
  3210.                             Note->Flags = eCmdSweepAccentRel4;
  3211.                             break;
  3212.                         case 160: /* 160 = restore pitch displacement depth */
  3213.                             Note->Flags = eCmdRestorePitchDispDepth;
  3214.                             break;
  3215.                         case 161: /* 161 = set pitch displacement depth */
  3216.                             Note->Flags = eCmdSetPitchDispDepth;
  3217.                             break;
  3218.                         case 162: /* 162 = adjust pitch displacement depth */
  3219.                             Note->Flags = eCmdIncPitchDispDepth;
  3220.                             break;
  3221.                         case 163: /* 163 = set pitch displacement depth modulation mode */
  3222.                             if (FormatVersionNumber == 1)
  3223.                                 {
  3224.                                     /* turn this into an empty marker */
  3225.                                     Note->Flags = eCmdMarker;
  3226.                                 }
  3227.                             break;
  3228.                         case 164: /* 164 = sweep pitch displacement depth absolute */
  3229.                             Note->Flags = eCmdSweepPitchDispDepthAbs;
  3230.                             break;
  3231.                         case 165: /* 165 = sweep pitch displacement depth relative */
  3232.                             Note->Flags = eCmdSweepPitchDispDepthRel;
  3233.                             break;
  3234.                         case 176: /* 176 = restore pitch displacement rate */
  3235.                             Note->Flags = eCmdRestorePitchDispRate;
  3236.                             break;
  3237.                         case 177: /* 177 = set pitch displacement rate */
  3238.                             Note->Flags = eCmdSetPitchDispRate;
  3239.                             break;
  3240.                         case 178: /* 178 = adjust pitch displacement rate */
  3241.                             Note->Flags = eCmdIncPitchDispRate;
  3242.                             break;
  3243.                         case 179: /* 179 = sweep pitch displacement rate absolute */
  3244.                             Note->Flags = eCmdSweepPitchDispRateAbs;
  3245.                             break;
  3246.                         case 180: /* 180 = sweep pitch displacement rate relative */
  3247.                             Note->Flags = eCmdSweepPitchDispRateRel;
  3248.                             break;
  3249.                         case 192: /* 192 = restore pitch displacement start point */
  3250.                             Note->Flags = eCmdRestorePitchDispStart;
  3251.                             break;
  3252.                         case 193: /* 193 = set pitch displacement start point */
  3253.                             Note->Flags = eCmdSetPitchDispStart;
  3254.                             break;
  3255.                         case 194: /* 194 = adjust pitch displacement start point */
  3256.                             Note->Flags = eCmdIncPitchDispStart;
  3257.                             break;
  3258.                         case 195: /* 195 = set pitch displacement start point origin */
  3259.                             Note->Flags = eCmdPitchDispStartOrigin;
  3260.                             break;
  3261.                         case 196: /* 196 = sweep pitch displacement start point absolute */
  3262.                             Note->Flags = eCmdSweepPitchDispStartAbs;
  3263.                             break;
  3264.                         case 197: /* 197 = sweep pitch displacement start point relative */
  3265.                             Note->Flags = eCmdSweepPitchDispStartRel;
  3266.                             break;
  3267.                         case 208: /* 208 = restore hurry-up factor */
  3268.                             Note->Flags = eCmdRestoreHurryUp;
  3269.                             break;
  3270.                         case 209: /* 209 = set hurry-up factor */
  3271.                             Note->Flags = eCmdSetHurryUp;
  3272.                             break;
  3273.                         case 210: /* 210 = adjust hurry-up factor */
  3274.                             Note->Flags = eCmdIncHurryUp;
  3275.                             break;
  3276.                         case 211: /* 211 = sweep hurry-up factor absolute */
  3277.                             Note->Flags = eCmdSweepHurryUpAbs;
  3278.                             break;
  3279.                         case 212: /* 212 = sweep hurry-up factor relative */
  3280.                             Note->Flags = eCmdSweepHurryUpRel;
  3281.                             break;
  3282.                         case 224: /* 224 = restore detuning */
  3283.                             Note->Flags = eCmdRestoreDetune;
  3284.                             break;
  3285.                         case 225: /* 225 = set detuning */
  3286.                             Note->Flags = eCmdSetDetune;
  3287.                             break;
  3288.                         case 226: /* 226 = adjust detuning */
  3289.                             Note->Flags = eCmdIncDetune;
  3290.                             break;
  3291.                         case 227: /* 227 = set detuning mode */
  3292.                             Note->Flags = eCmdDetuneMode;
  3293.                             break;
  3294.                         case 228: /* 228 = sweep detuning absolute */
  3295.                             Note->Flags = eCmdSweepDetuneAbs;
  3296.                             break;
  3297.                         case 229: /* 229 = sweep detuning relative */
  3298.                             Note->Flags = eCmdSweepDetuneRel;
  3299.                             break;
  3300.                         case 240: /* 240 = restore early/late adjust */
  3301.                             Note->Flags = eCmdRestoreEarlyLateAdjust;
  3302.                             break;
  3303.                         case 241: /* 241 = set early/late adjust */
  3304.                             Note->Flags = eCmdSetEarlyLateAdjust;
  3305.                             break;
  3306.                         case 242: /* 242 = adjust early/late adjust */
  3307.                             Note->Flags = eCmdIncEarlyLateAdjust;
  3308.                             break;
  3309.                         case 243: /* 243 = sweep early/late adjust absolute */
  3310.                             Note->Flags = eCmdSweepEarlyLateAbs;
  3311.                             break;
  3312.                         case 244: /* 244 = sweep early/late adjust relative */
  3313.                             Note->Flags = eCmdSweepEarlyLateRel;
  3314.                             break;
  3315.                         case 256: /* 256 = restore duration adjust */
  3316.                             Note->Flags = eCmdRestoreDurationAdjust;
  3317.                             break;
  3318.                         case 257: /* 257 = set duration adjust */
  3319.                             Note->Flags = eCmdSetDurationAdjust;
  3320.                             break;
  3321.                         case 258: /* 258 = adjust duration adjust */
  3322.                             Note->Flags = eCmdIncDurationAdjust;
  3323.                             break;
  3324.                         case 259: /* 259 = sweep duration adjust absolute */
  3325.                             Note->Flags = eCmdSweepDurationAbs;
  3326.                             break;
  3327.                         case 260: /* 260 = sweep duration adjust relative */
  3328.                             Note->Flags = eCmdSweepDurationRel;
  3329.                             break;
  3330.                         case 261: /* 261 = set duration adjust mode */
  3331.                             Note->Flags = eCmdDurationAdjustMode;
  3332.                             break;
  3333.                         case 272: /* 272 = set meter */
  3334.                             Note->Flags = eCmdSetMeter;
  3335.                             break;
  3336.                         case 273: /* 273 = set measure number */
  3337.                             Note->Flags = eCmdSetMeasureNumber;
  3338.                             break;
  3339.                         case 288: /* 288 = comment */
  3340.                             Note->Flags = eCmdMarker;
  3341.                             break;
  3342.                         case 304: /* 304 = restore surround position */
  3343.                             Note->Flags = eCmdRestoreSurroundPosition;
  3344.                             break;
  3345.                         case 305: /* 305 = set surround position */
  3346.                             Note->Flags = eCmdSetSurroundPosition;
  3347.                             break;
  3348.                         case 306: /* 306 = adjust surround position */
  3349.                             Note->Flags = eCmdIncSurroundPosition;
  3350.                             break;
  3351.                         case 307: /* 307 = sweep surround position absolute */
  3352.                             Note->Flags = eCmdSweepSurroundAbs;
  3353.                             break;
  3354.                         case 308: /* 308 = sweep surround position relative */
  3355.                             Note->Flags = eCmdSweepSurroundRel;
  3356.                             break;
  3357.                         case 320: /* 320 = set transpose */
  3358.                             Note->Flags = eCmdSetTranspose;
  3359.                             break;
  3360.                         case 321: /* 321 = adjust transpose */
  3361.                             Note->Flags = eCmdAdjustTranspose;
  3362.                             break;
  3363.                         case 336: /* 336 = set effect accent 1 */
  3364.                             Note->Flags = eCmdSetEffectParam1;
  3365.                             break;
  3366.                         case 337: /* 337 = adjust effect accent 1 */
  3367.                             Note->Flags = eCmdIncEffectParam1;
  3368.                             break;
  3369.                         case 338: /* 338 = sweep effect accent 1 absolute */
  3370.                             Note->Flags = eCmdSweepEffectParamAbs1;
  3371.                             break;
  3372.                         case 339: /* 339 = sweep effect accent 1 relative */
  3373.                             Note->Flags = eCmdSweepEffectParamRel1;
  3374.                             break;
  3375.                         case 352: /* 352 = set effect accent 2 */
  3376.                             Note->Flags = eCmdSetEffectParam2;
  3377.                             break;
  3378.                         case 353: /* 353 = adjust effect accent 2 */
  3379.                             Note->Flags = eCmdIncEffectParam2;
  3380.                             break;
  3381.                         case 354: /* 354 = sweep effect accent 2 absolute */
  3382.                             Note->Flags = eCmdSweepEffectParamAbs2;
  3383.                             break;
  3384.                         case 355: /* 355 = sweep effect accent 2 relative */
  3385.                             Note->Flags = eCmdSweepEffectParamRel2;
  3386.                             break;
  3387.                         case 368: /* 368 = set effect accent 3 */
  3388.                             Note->Flags = eCmdSetEffectParam3;
  3389.                             break;
  3390.                         case 369: /* 369 = adjust effect accent 3 */
  3391.                             Note->Flags = eCmdIncEffectParam3;
  3392.                             break;
  3393.                         case 370: /* 370 = sweep effect accent 3 absolute */
  3394.                             Note->Flags = eCmdSweepEffectParamAbs3;
  3395.                             break;
  3396.                         case 371: /* 371 = sweep effect accent 3 relative */
  3397.                             Note->Flags = eCmdSweepEffectParamRel3;
  3398.                             break;
  3399.                         case 384: /* 384 = set effect accent 4 */
  3400.                             Note->Flags = eCmdSetEffectParam4;
  3401.                             break;
  3402.                         case 385: /* 385 = adjust effect accent 4 */
  3403.                             Note->Flags = eCmdIncEffectParam4;
  3404.                             break;
  3405.                         case 386: /* 386 = sweep effect accent 4 absolute */
  3406.                             Note->Flags = eCmdSweepEffectParamAbs4;
  3407.                             break;
  3408.                         case 387: /* 387 = sweep effect accent 4 relative */
  3409.                             Note->Flags = eCmdSweepEffectParamRel4;
  3410.                             break;
  3411.                         case 400: /* 400 = set global score effect accent 1 */
  3412.                             Note->Flags = eCmdSetScoreEffectParam1;
  3413.                             break;
  3414.                         case 401: /* 401 = adjust global score effect accent 1 */
  3415.                             Note->Flags = eCmdIncScoreEffectParam1;
  3416.                             break;
  3417.                         case 402: /* 402 = sweep global score effect accent 1 absolute */
  3418.                             Note->Flags = eCmdSweepScoreEffectParamAbs1;
  3419.                             break;
  3420.                         case 403: /* 403 = sweep global score effect accent 1 relative */
  3421.                             Note->Flags = eCmdSweepScoreEffectParamRel1;
  3422.                             break;
  3423.                         case 416: /* 416 = set global score effect accent 2 */
  3424.                             Note->Flags = eCmdSetScoreEffectParam2;
  3425.                             break;
  3426.                         case 417: /* 417 = adjust global score effect accent 2 */
  3427.                             Note->Flags = eCmdIncScoreEffectParam2;
  3428.                             break;
  3429.                         case 418: /* 418 = sweep global score effect accent 2 absolute */
  3430.                             Note->Flags = eCmdSweepScoreEffectParamAbs2;
  3431.                             break;
  3432.                         case 419: /* 419 = sweep global score effect accent 2 relative */
  3433.                             Note->Flags = eCmdSweepScoreEffectParamRel2;
  3434.                             break;
  3435.                         case 432: /* 432 = set global score effect accent 3 */
  3436.                             Note->Flags = eCmdSetScoreEffectParam3;
  3437.                             break;
  3438.                         case 433: /* 433 = adjust global score effect accent 3 */
  3439.                             Note->Flags = eCmdIncScoreEffectParam3;
  3440.                             break;
  3441.                         case 434: /* 434 = sweep global score effect accent 3 absolute */
  3442.                             Note->Flags = eCmdSweepScoreEffectParamAbs3;
  3443.                             break;
  3444.                         case 435: /* 435 = sweep global score effect accent 3 relative */
  3445.                             Note->Flags = eCmdSweepScoreEffectParamRel3;
  3446.                             break;
  3447.                         case 448: /* 448 = set global score effect accent 4 */
  3448.                             Note->Flags = eCmdSetScoreEffectParam4;
  3449.                             break;
  3450.                         case 449: /* 449 = adjust global score effect accent 4 */
  3451.                             Note->Flags = eCmdIncScoreEffectParam4;
  3452.                             break;
  3453.                         case 450: /* 450 = sweep global score effect accent 4 absolute */
  3454.                             Note->Flags = eCmdSweepScoreEffectParamAbs4;
  3455.                             break;
  3456.                         case 451: /* 451 = sweep global score effect accent 4 relative */
  3457.                             Note->Flags = eCmdSweepScoreEffectParamRel4;
  3458.                             break;
  3459.                         case 464: /* 464 = track effects switch */
  3460.                             Note->Flags = eCmdTrackEffectEnable;
  3461.                             break;
  3462.                     }
  3463.                 Note->Flags |= eCommandFlag;
  3464.             }
  3465.  
  3466.         *ObjectOut = Note;
  3467.         return eFileLoadNoError;
  3468.     }
  3469.  
  3470.  
  3471. /* write a note object to the file.  this does not handle ties since they are */
  3472. /* done separately. */
  3473. FileLoadingErrors            NoteObjectWriteDataOut(NoteObjectRec* Note,
  3474.                                                 struct BufferedOutputRec* Output)
  3475.     {
  3476.         CheckPtrExistence(Note);
  3477.         CheckPtrExistence(Output);
  3478.  
  3479.         if ((Note->Flags & eCommandFlag) == 0)
  3480.             {
  3481.                 /* note */
  3482.  
  3483.                 /*   4-byte unsigned little endian opcode field */
  3484.                 /*       for a command, the high bit will be 1 and the remaining bits will */
  3485.                 /*       be the opcode.  for a note, the high bit will be 0. */
  3486.                 if (!WriteBufferedUnsignedLongLittleEndian(Output,Note->Flags))
  3487.                     {
  3488.                         return eFileLoadDiskError;
  3489.                     }
  3490.  
  3491.                 /*   2-byte signed little endian pitch index */
  3492.                 /*       should be a value in the range 0..383.  Middle C (261.6 Hertz) = 192 */
  3493.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.Pitch))
  3494.                     {
  3495.                         return eFileLoadDiskError;
  3496.                     }
  3497.  
  3498.                 /*   2-byte little endian small integer coded decimal portamento duration. */
  3499.                 /*       this determines how long a portamento will last, in fractions of a quarter */
  3500.                 /*       note.  it only has effect if the note is the target of a tie.  a value of */
  3501.                 /*       0 means instantaneous, i.e. no portamento. */
  3502.                 if (!WriteBufferedSignedShortLittleEndian(Output,
  3503.                     Note->a.Note.PortamentoDuration))
  3504.                     {
  3505.                         return eFileLoadDiskError;
  3506.                     }
  3507.  
  3508.                 /*   2-byte little endian small integer coded decimal early/late adjustment */
  3509.                 /*       this determines the displacement in time of the occurrence of the note */
  3510.                 /*       in frations of a quarter note. */
  3511.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.EarlyLateAdjust))
  3512.                     {
  3513.                         return eFileLoadDiskError;
  3514.                     }
  3515.  
  3516.                 /*   2-byte little endian small integer coded decimal duration adjustment */
  3517.                 /*       this value changes the duration of the note by being added to the */
  3518.                 /*       duration or being multiplied by the duration. */
  3519.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.DurationAdjust))
  3520.                     {
  3521.                         return eFileLoadDiskError;
  3522.                     }
  3523.  
  3524.                 /*   2-byte little endian small integer coded decimal release point 1 location */
  3525.                 /*       this determines when the release of the first sustain/loop will occur */
  3526.                 /*       in fractions of the current note's duration.  it is relative to the origin */
  3527.                 /*       as determined by the opcode field. */
  3528.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.ReleasePoint1))
  3529.                     {
  3530.                         return eFileLoadDiskError;
  3531.                     }
  3532.  
  3533.                 /*   2-byte little endian small integer coded decimal release point 2 location */
  3534.                 /*       this determines when the release of the second sustain/loop will occur. */
  3535.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.ReleasePoint2))
  3536.                     {
  3537.                         return eFileLoadDiskError;
  3538.                     }
  3539.  
  3540.                 /*   2-byte little endian small integer coded decimal overall loudness adjustment */
  3541.                 /*       this factor scales the total volume output of the oscillators for this */
  3542.                 /*       particular note.  It is multiplied, so a value of 1 makes no change in */
  3543.                 /*       loudness. */
  3544.                 if (!WriteBufferedSignedShortLittleEndian(Output,
  3545.                     Note->a.Note.OverallLoudnessAdjustment))
  3546.                     {
  3547.                         return eFileLoadDiskError;
  3548.                     }
  3549.  
  3550.                 /*   2-byte little endian small integer coded decimal stereo position adjustment. */
  3551.                 /*       this value adjusts where the sound will be located in stereo.  -1 is */
  3552.                 /*       the far left, 1 is the far right, and 0 is center. */
  3553.                 if (!WriteBufferedSignedShortLittleEndian(Output,
  3554.                     Note->a.Note.StereoPositionAdjustment))
  3555.                     {
  3556.                         return eFileLoadDiskError;
  3557.                     }
  3558.  
  3559.                 /*   2-byte little endian small integer coded decimal surround position adjustment. */
  3560.                 /*       this value adjusts where the sound will be located in surroud. */
  3561.                 /*       1 is front and -1 is rear */
  3562.                 if (!WriteBufferedSignedShortLittleEndian(Output,
  3563.                     Note->a.Note.SurroundPositionAdjustment))
  3564.                     {
  3565.                         return eFileLoadDiskError;
  3566.                     }
  3567.  
  3568.                 /*   2-byte little endian small integer coded decimal accent 1 value */
  3569.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.Accent1))
  3570.                     {
  3571.                         return eFileLoadDiskError;
  3572.                     }
  3573.  
  3574.                 /*   2-byte little endian small integer coded decimal accent 2 value */
  3575.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.Accent2))
  3576.                     {
  3577.                         return eFileLoadDiskError;
  3578.                     }
  3579.  
  3580.                 /*   2-byte little endian small integer coded decimal accent 3 value */
  3581.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.Accent3))
  3582.                     {
  3583.                         return eFileLoadDiskError;
  3584.                     }
  3585.  
  3586.                 /*   2-byte little endian small integer coded decimal accent 4 value */
  3587.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.Accent4))
  3588.                     {
  3589.                         return eFileLoadDiskError;
  3590.                     }
  3591.  
  3592.                 /*   2-byte little endian fake pitch value */
  3593.                 /*       this value has a range of -1..383.  If it is not -1, then it will be used */
  3594.                 /*       to determine which sample a multisampled oscillator will use.  If it is -1 */
  3595.                 /*       then the actual pitch will be used to select a sample. */
  3596.                 if (!WriteBufferedSignedShortLittleEndian(Output,
  3597.                     Note->a.Note.MultisamplePitchAsIf))
  3598.                     {
  3599.                         return eFileLoadDiskError;
  3600.                     }
  3601.  
  3602.                 /*   2-byte little endian small integer coded decimal pitch disp depth adjustment */
  3603.                 /*       this adjusts the maximum amplitude of the pitch displacement depth */
  3604.                 /*       oscillator (vibrato).  The value has units of either half steps or hertz */
  3605.                 /*       depending on the setting in the opcode word. */
  3606.                 if (!WriteBufferedSignedShortLittleEndian(Output,
  3607.                     Note->a.Note.PitchDisplacementDepthAdjustment))
  3608.                     {
  3609.                         return eFileLoadDiskError;
  3610.                     }
  3611.  
  3612.                 /*   2-byte little endian small integer coded decimal pitch displ rate adjustment */
  3613.                 /*       this adjusts the maximum amplitude of the pitch displacement rate */
  3614.                 /*       oscillator. the units are periods per second. */
  3615.                 if (!WriteBufferedSignedShortLittleEndian(Output,
  3616.                     Note->a.Note.PitchDisplacementRateAdjustment))
  3617.                     {
  3618.                         return eFileLoadDiskError;
  3619.                     }
  3620.  
  3621.                 /*   2-byte little endian small integer coded decimal pitch displ start point adjust */
  3622.                 /*       this value adjusts when the pitch displacement envelopes start.  the */
  3623.                 /*       location is from start or end of note, depending on the opcode settings, and */
  3624.                 /*       is in fractions of the current note's duration. */
  3625.                 if (!WriteBufferedSignedShortLittleEndian(Output,
  3626.                     Note->a.Note.PitchDisplacementStartPoint))
  3627.                     {
  3628.                         return eFileLoadDiskError;
  3629.                     }
  3630.  
  3631.                 /*   2-byte little endian small integer coded decimal hurry-up factor */
  3632.                 /*       this factor scales the total speed at which all envelopes change.  this is */
  3633.                 /*       multiplicative, so a value of 1 makes no change, and smaller values make */
  3634.                 /*       transitions go faster. */
  3635.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.HurryUpFactor))
  3636.                     {
  3637.                         return eFileLoadDiskError;
  3638.                     }
  3639.  
  3640.                 /*   2-byte little endian small integer coded decimal detuning value */
  3641.                 /*       this value is added to the pitch of the note to detune.  its units are */
  3642.                 /*       either hertz or half steps depending on the opcode word. */
  3643.                 if (!WriteBufferedSignedShortLittleEndian(Output,Note->a.Note.Detuning))
  3644.                     {
  3645.                         return eFileLoadDiskError;
  3646.                     }
  3647.             }
  3648.          else
  3649.             {
  3650.                 unsigned long                Command;
  3651.  
  3652.                 /* write out a command */
  3653.  
  3654.                 /* convert internal enum index into the file format index */
  3655.                 switch (Note->Flags & ~eCommandFlag)
  3656.                     {
  3657.                         default:
  3658.                             EXECUTE(PRERR(ForceAbort,"NoteObjectWriteDataOut:  bad command"));
  3659.                             break;
  3660.                         case eCmdRestoreTempo: /* 16 = restore tempo */
  3661.                             Command = 16;
  3662.                             break;
  3663.                         case eCmdSetTempo: /* 17 = set tempo */
  3664.                             Command = 17;
  3665.                             break;
  3666.                         case eCmdIncTempo: /* 18 = adjust tempo */
  3667.                             Command = 18;
  3668.                             break;
  3669.                         case eCmdSweepTempoAbs: /* 19 = sweep tempo absolute */
  3670.                             Command = 19;
  3671.                             break;
  3672.                         case eCmdSweepTempoRel: /* 20 = sweep tempo relative */
  3673.                             Command = 20;
  3674.                             break;
  3675.                         case eCmdRestoreStereoPosition: /* 32 = restore stereo position */
  3676.                             Command = 32;
  3677.                             break;
  3678.                         case eCmdSetStereoPosition: /* 33 = set stereo position */
  3679.                             Command = 33;
  3680.                             break;
  3681.                         case eCmdIncStereoPosition: /* 34 = adjust stereo position */
  3682.                             Command = 34;
  3683.                             break;
  3684.                         case eCmdSweepStereoAbs: /* 35 = sweep stereo position absolute */
  3685.                             Command = 35;
  3686.                             break;
  3687.                         case eCmdSweepStereoRel: /* 36 = sweep stereo position relative */
  3688.                             Command = 36;
  3689.                             break;
  3690.                         case eCmdRestoreVolume: /* 48 = restore volume */
  3691.                             Command = 48;
  3692.                             break;
  3693.                         case eCmdSetVolume: /* 49 = set volume */
  3694.                             Command = 49;
  3695.                             break;
  3696.                         case eCmdIncVolume: /* 50 = adjust volume */
  3697.                             Command = 50;
  3698.                             break;
  3699.                         case eCmdSweepVolumeAbs: /* 51 = sweep volume absolute */
  3700.                             Command = 51;
  3701.                             break;
  3702.                         case eCmdSweepVolumeRel: /* 52 = sweep volume relative */
  3703.                             Command = 52;
  3704.                             break;
  3705.                         case eCmdRestoreReleasePoint1: /* 64 = restore release point 1 */
  3706.                             Command = 64;
  3707.                             break;
  3708.                         case eCmdSetReleasePoint1: /* 65 = set release point 1 */
  3709.                             Command = 65;
  3710.                             break;
  3711.                         case eCmdIncReleasePoint1: /* 66 = adjust release point 1 */
  3712.                             Command = 66;
  3713.                             break;
  3714.                         case eCmdReleasePointOrigin1: /* 67 = set release point 1 origin */
  3715.                             Command = 67;
  3716.                             break;
  3717.                         case eCmdSweepReleaseAbs1: /* 68 = sweep release point 1 absolute */
  3718.                             Command = 68;
  3719.                             break;
  3720.                         case eCmdSweepReleaseRel1: /* 69 = sweep release point 1 relative */
  3721.                             Command = 69;
  3722.                             break;
  3723.                         case eCmdRestoreReleasePoint2: /* 80 = restore release point 2 */
  3724.                             Command = 80;
  3725.                             break;
  3726.                         case eCmdSetReleasePoint2: /* 81 = set release point 2 */
  3727.                             Command = 81;
  3728.                             break;
  3729.                         case eCmdIncReleasePoint2: /* 82 = adjust release point 2 */
  3730.                             Command = 82;
  3731.                             break;
  3732.                         case eCmdReleasePointOrigin2: /* 83 = set release point 2 origin */
  3733.                             Command = 83;
  3734.                             break;
  3735.                         case eCmdSweepReleaseAbs2: /* 84 = sweep release point 2 absolute */
  3736.                             Command = 84;
  3737.                             break;
  3738.                         case eCmdSweepReleaseRel2: /* 85 = sweep release point 2 relative */
  3739.                             Command = 85;
  3740.                             break;
  3741.                         case eCmdRestoreAccent1: /* 96 = restore accent 1 */
  3742.                             Command = 96;
  3743.                             break;
  3744.                         case eCmdSetAccent1: /* 97 = set accent 1 */
  3745.                             Command = 97;
  3746.                             break;
  3747.                         case eCmdIncAccent1: /* 98 = adjust accent 1 */
  3748.                             Command = 98;
  3749.                             break;
  3750.                         case eCmdSweepAccentAbs1: /* 99 = sweep accent 1 absolute */
  3751.                             Command = 99;
  3752.                             break;
  3753.                         case eCmdSweepAccentRel1: /* 100 = sweep accent 1 relative */
  3754.                             Command = 100;
  3755.                             break;
  3756.                         case eCmdRestoreAccent2: /* 112 = restore accent 2 */
  3757.                             Command = 112;
  3758.                             break;
  3759.                         case eCmdSetAccent2: /* 113 = set accent 2 */
  3760.                             Command = 113;
  3761.                             break;
  3762.                         case eCmdIncAccent2: /* 114 = adjust accent 2 */
  3763.                             Command = 114;
  3764.                             break;
  3765.                         case eCmdSweepAccentAbs2: /* 115 = sweep accent 2 absolute */
  3766.                             Command = 115;
  3767.                             break;
  3768.                         case eCmdSweepAccentRel2: /* 116 = sweep accent 2 relative */
  3769.                             Command = 116;
  3770.                             break;
  3771.                         case eCmdRestoreAccent3: /* 128 = restore accent 3 */
  3772.                             Command = 128;
  3773.                             break;
  3774.                         case eCmdSetAccent3: /* 129 = set accent 3 */
  3775.                             Command = 129;
  3776.                             break;
  3777.                         case eCmdIncAccent3: /* 130 = adjust accent 3 */
  3778.                             Command = 130;
  3779.                             break;
  3780.                         case eCmdSweepAccentAbs3: /* 131 = sweep accent 3 absolute */
  3781.                             Command = 131;
  3782.                             break;
  3783.                         case eCmdSweepAccentRel3: /* 132 = sweep accent 3 relative */
  3784.                             Command = 132;
  3785.                             break;
  3786.                         case eCmdRestoreAccent4: /* 144 = restore accent 4 */
  3787.                             Command = 144;
  3788.                             break;
  3789.                         case eCmdSetAccent4: /* 145 = set accent 4 */
  3790.                             Command = 145;
  3791.                             break;
  3792.                         case eCmdIncAccent4: /* 146 = adjust accent 4 */
  3793.                             Command = 146;
  3794.                             break;
  3795.                         case eCmdSweepAccentAbs4: /* 147 = sweep accent 4 absolute */
  3796.                             Command = 147;
  3797.                             break;
  3798.                         case eCmdSweepAccentRel4: /* 148 = sweep accent 4 relative */
  3799.                             Command = 148;
  3800.                             break;
  3801.                         case eCmdRestorePitchDispDepth: /* 160 = restore pitch displacement depth */
  3802.                             Command = 160;
  3803.                             break;
  3804.                         case eCmdSetPitchDispDepth: /* 161 = set pitch displacement depth */
  3805.                             Command = 161;
  3806.                             break;
  3807.                         case eCmdIncPitchDispDepth: /* 162 = adjust pitch displacement depth */
  3808.                             Command = 162;
  3809.                             break;
  3810.                         case eCmdSweepPitchDispDepthAbs: /* 164 = sweep pitch displacement depth absolute */
  3811.                             Command = 164;
  3812.                             break;
  3813.                         case eCmdSweepPitchDispDepthRel: /* 165 = sweep pitch displacement depth relative */
  3814.                             Command = 165;
  3815.                             break;
  3816.                         case eCmdRestorePitchDispRate: /* 176 = restore pitch displacement rate */
  3817.                             Command = 176;
  3818.                             break;
  3819.                         case eCmdSetPitchDispRate: /* 177 = set pitch displacement rate */
  3820.                             Command = 177;
  3821.                             break;
  3822.                         case eCmdIncPitchDispRate: /* 178 = adjust pitch displacement rate */
  3823.                             Command = 178;
  3824.                             break;
  3825.                         case eCmdSweepPitchDispRateAbs: /* 179 = sweep pitch displacement rate absolute */
  3826.                             Command = 179;
  3827.                             break;
  3828.                         case eCmdSweepPitchDispRateRel: /* 180 = sweep pitch displacement rate relative */
  3829.                             Command = 180;
  3830.                             break;
  3831.                         case eCmdRestorePitchDispStart: /* 192 = restore pitch displacement start point */
  3832.                             Command = 192;
  3833.                             break;
  3834.                         case eCmdSetPitchDispStart: /* 193 = set pitch displacement start point */
  3835.                             Command = 193;
  3836.                             break;
  3837.                         case eCmdIncPitchDispStart: /* 194 = adjust pitch displacement start point */
  3838.                             Command = 194;
  3839.                             break;
  3840.                         case eCmdPitchDispStartOrigin: /* 195 = set pitch displacement start point origin */
  3841.                             Command = 195;
  3842.                             break;
  3843.                         case eCmdSweepPitchDispStartAbs: /* 196 = sweep pitch displacement start point absolute */
  3844.                             Command = 196;
  3845.                             break;
  3846.                         case eCmdSweepPitchDispStartRel: /* 197 = sweep pitch displacement start point relative */
  3847.                             Command = 197;
  3848.                             break;
  3849.                         case eCmdRestoreHurryUp: /* 208 = restore hurry-up factor */
  3850.                             Command = 208;
  3851.                             break;
  3852.                         case eCmdSetHurryUp: /* 209 = set hurry-up factor */
  3853.                             Command = 209;
  3854.                             break;
  3855.                         case eCmdIncHurryUp: /* 210 = adjust hurry-up factor */
  3856.                             Command = 210;
  3857.                             break;
  3858.                         case eCmdSweepHurryUpAbs: /* 211 = sweep hurry-up factor absolute */
  3859.                             Command = 211;
  3860.                             break;
  3861.                         case eCmdSweepHurryUpRel: /* 212 = sweep hurry-up factor relative */
  3862.                             Command = 212;
  3863.                             break;
  3864.                         case eCmdRestoreDetune: /* 224 = restore detuning */
  3865.                             Command = 224;
  3866.                             break;
  3867.                         case eCmdSetDetune: /* 225 = set detuning */
  3868.                             Command = 225;
  3869.                             break;
  3870.                         case eCmdIncDetune: /* 226 = adjust detuning */
  3871.                             Command = 226;
  3872.                             break;
  3873.                         case eCmdDetuneMode: /* 227 = set detuning mode */
  3874.                             Command = 227;
  3875.                             break;
  3876.                         case eCmdSweepDetuneAbs: /* 228 = sweep detuning absolute */
  3877.                             Command = 228;
  3878.                             break;
  3879.                         case eCmdSweepDetuneRel: /* 229 = sweep detuning relative */
  3880.                             Command = 229;
  3881.                             break;
  3882.                         case eCmdRestoreEarlyLateAdjust: /* 240 = restore early/late adjust */
  3883.                             Command = 240;
  3884.                             break;
  3885.                         case eCmdSetEarlyLateAdjust: /* 241 = set early/late adjust */
  3886.                             Command = 241;
  3887.                             break;
  3888.                         case eCmdIncEarlyLateAdjust: /* 242 = adjust early/late adjust */
  3889.                             Command = 242;
  3890.                             break;
  3891.                         case eCmdSweepEarlyLateAbs: /* 243 = sweep early/late adjust absolute */
  3892.                             Command = 243;
  3893.                             break;
  3894.                         case eCmdSweepEarlyLateRel: /* 244 = sweep early/late adjust relative */
  3895.                             Command = 244;
  3896.                             break;
  3897.                         case eCmdRestoreDurationAdjust: /* 256 = restore duration adjust */
  3898.                             Command = 256;
  3899.                             break;
  3900.                         case eCmdSetDurationAdjust: /* 257 = set duration adjust */
  3901.                             Command = 257;
  3902.                             break;
  3903.                         case eCmdIncDurationAdjust: /* 258 = adjust duration adjust */
  3904.                             Command = 258;
  3905.                             break;
  3906.                         case eCmdSweepDurationAbs: /* 259 = sweep duration adjust absolute */
  3907.                             Command = 259;
  3908.                             break;
  3909.                         case eCmdSweepDurationRel: /* 260 = sweep duration adjust relative */
  3910.                             Command = 260;
  3911.                             break;
  3912.                         case eCmdDurationAdjustMode: /* 261 = set duration adjust mode */
  3913.                             Command = 261;
  3914.                             break;
  3915.                         case eCmdSetMeter: /* 272 = set meter */
  3916.                             Command = 272;
  3917.                             break;
  3918.                         case eCmdSetMeasureNumber: /* 273 = set measure number */
  3919.                             Command = 273;
  3920.                             break;
  3921.                         case eCmdMarker: /* 288 = comment */
  3922.                             Command = 288;
  3923.                             break;
  3924.                         case eCmdRestoreSurroundPosition: /* 304 = restore surround position */
  3925.                             Command = 304;
  3926.                             break;
  3927.                         case eCmdSetSurroundPosition: /* 305 = set surround position */
  3928.                             Command = 305;
  3929.                             break;
  3930.                         case eCmdIncSurroundPosition: /* 306 = adjust surround position */
  3931.                             Command = 306;
  3932.                             break;
  3933.                         case eCmdSweepSurroundAbs: /* 307 = sweep surround position absolute */
  3934.                             Command = 307;
  3935.                             break;
  3936.                         case eCmdSweepSurroundRel: /* 308 = sweep surround position relative */
  3937.                             Command = 308;
  3938.                             break;
  3939.                         case eCmdSetTranspose: /* 320 = set transpose */
  3940.                             Command = 320;
  3941.                             break;
  3942.                         case eCmdAdjustTranspose: /* 321 = adjust transpose */
  3943.                             Command = 321;
  3944.                             break;
  3945.                         case eCmdSetEffectParam1: /* 336 = set effect accent 1 */
  3946.                             Command = 336;
  3947.                             break;
  3948.                         case eCmdIncEffectParam1: /* 337 = adjust effect accent 1 */
  3949.                             Command = 337;
  3950.                             break;
  3951.                         case eCmdSweepEffectParamAbs1: /* 338 = sweep effect accent 1 absolute */
  3952.                             Command = 338;
  3953.                             break;
  3954.                         case eCmdSweepEffectParamRel1: /* 339 = sweep effect accent 1 relative */
  3955.                             Command = 339;
  3956.                             break;
  3957.                         case eCmdSetEffectParam2: /* 352 = set effect accent 2 */
  3958.                             Command = 352;
  3959.                             break;
  3960.                         case eCmdIncEffectParam2: /* 353 = adjust effect accent 2 */
  3961.                             Command = 353;
  3962.                             break;
  3963.                         case eCmdSweepEffectParamAbs2: /* 354 = sweep effect accent 2 absolute */
  3964.                             Command = 354;
  3965.                             break;
  3966.                         case eCmdSweepEffectParamRel2: /* 355 = sweep effect accent 2 relative */
  3967.                             Command = 355;
  3968.                             break;
  3969.                         case eCmdSetEffectParam3: /* 368 = set effect accent 3 */
  3970.                             Command = 368;
  3971.                             break;
  3972.                         case eCmdIncEffectParam3: /* 369 = adjust effect accent 3 */
  3973.                             Command = 369;
  3974.                             break;
  3975.                         case eCmdSweepEffectParamAbs3: /* 370 = sweep effect accent 3 absolute */
  3976.                             Command = 370;
  3977.                             break;
  3978.                         case eCmdSweepEffectParamRel3: /* 371 = sweep effect accent 3 relative */
  3979.                             Command = 371;
  3980.                             break;
  3981.                         case eCmdSetEffectParam4: /* 384 = set effect accent 4 */
  3982.                             Command = 384;
  3983.                             break;
  3984.                         case eCmdIncEffectParam4: /* 385 = adjust effect accent 4 */
  3985.                             Command = 385;
  3986.                             break;
  3987.                         case eCmdSweepEffectParamAbs4: /* 386 = sweep effect accent 4 absolute */
  3988.                             Command = 386;
  3989.                             break;
  3990.                         case eCmdSweepEffectParamRel4: /* 387 = sweep effect accent 4 relative */
  3991.                             Command = 387;
  3992.                             break;
  3993.                         case eCmdTrackEffectEnable: /* 464 = track effects switch */
  3994.                             Command = 464;
  3995.                             break;
  3996.                         case eCmdSetScoreEffectParam1: /* 400 = set global score effect accent 1 */
  3997.                             Command = 400;
  3998.                             break;
  3999.                         case eCmdIncScoreEffectParam1: /* 401 = adjust global score effect accent 1 */
  4000.                             Command = 401;
  4001.                             break;
  4002.                         case eCmdSweepScoreEffectParamAbs1: /* 402 = sweep global score effect accent 1 absolute */
  4003.                             Command = 402;
  4004.                             break;
  4005.                         case eCmdSweepScoreEffectParamRel1: /* 403 = sweep global score effect accent 1 relative */
  4006.                             Command = 403;
  4007.                             break;
  4008.                         case eCmdSetScoreEffectParam2: /* 416 = set global score effect accent 2 */
  4009.                             Command = 416;
  4010.                             break;
  4011.                         case eCmdIncScoreEffectParam2: /* 417 = adjust global score effect accent 2 */
  4012.                             Command = 417;
  4013.                             break;
  4014.                         case eCmdSweepScoreEffectParamAbs2: /* 418 = sweep global score effect accent 2 absolute */
  4015.                             Command = 418;
  4016.                             break;
  4017.                         case eCmdSweepScoreEffectParamRel2: /* 419 = sweep global score effect accent 2 relative */
  4018.                             Command = 419;
  4019.                             break;
  4020.                         case eCmdSetScoreEffectParam3: /* 432 = set global score effect accent 3 */
  4021.                             Command = 432;
  4022.                             break;
  4023.                         case eCmdIncScoreEffectParam3: /* 433 = adjust global score effect accent 3 */
  4024.                             Command = 433;
  4025.                             break;
  4026.                         case eCmdSweepScoreEffectParamAbs3: /* 434 = sweep global score effect accent 3 absolute */
  4027.                             Command = 434;
  4028.                             break;
  4029.                         case eCmdSweepScoreEffectParamRel3: /* 435 = sweep global score effect accent 3 relative */
  4030.                             Command = 435;
  4031.                             break;
  4032.                         case eCmdSetScoreEffectParam4: /* 448 = set global score effect accent 4 */
  4033.                             Command = 448;
  4034.                             break;
  4035.                         case eCmdIncScoreEffectParam4: /* 449 = adjust global score effect accent 4 */
  4036.                             Command = 449;
  4037.                             break;
  4038.                         case eCmdSweepScoreEffectParamAbs4: /* 450 = sweep global score effect accent 4 absolute */
  4039.                             Command = 450;
  4040.                             break;
  4041.                         case eCmdSweepScoreEffectParamRel4: /* 451 = sweep global score effect accent 4 relative */
  4042.                             Command = 451;
  4043.                             break;
  4044.                     }
  4045.                 if (!WriteBufferedUnsignedLongLittleEndian(Output,Command | eCommandFlag))
  4046.                     {
  4047.                         return eFileLoadDiskError;
  4048.                     }
  4049.  
  4050.                 /* write out the arguments */
  4051.                 switch (Note->Flags & ~eCommandFlag)
  4052.                     {
  4053.                         default:
  4054.                             EXECUTE(PRERR(ForceAbort,"NoteObjectWriteDataOut:  bad command"));
  4055.                             break;
  4056.  
  4057.                         /*   no arguments */
  4058.                         case eCmdRestoreTempo: /* 16 = restore tempo */
  4059.                         case eCmdRestoreStereoPosition: /* 32 = restore stereo position */
  4060.                         case eCmdRestoreVolume: /* 48 = restore volume */
  4061.                         case eCmdRestoreReleasePoint1: /* 64 = restore release point 1 */
  4062.                         case eCmdRestoreReleasePoint2: /* 80 = restore release point 2 */
  4063.                         case eCmdRestoreAccent1: /* 96 = restore accent 1 */
  4064.                         case eCmdRestoreAccent2: /* 112 = restore accent 2 */
  4065.                         case eCmdRestoreAccent3: /* 128 = restore accent 3 */
  4066.                         case eCmdRestoreAccent4: /* 144 = restore accent 4 */
  4067.                         case eCmdRestorePitchDispDepth: /* 160 = restore pitch displacement depth */
  4068.                         case eCmdRestorePitchDispRate: /* 176 = restore pitch displacement rate */
  4069.                         case eCmdRestorePitchDispStart: /* 192 = restore pitch displacement start point */
  4070.                         case eCmdRestoreHurryUp: /* 208 = restore hurry-up factor */
  4071.                         case eCmdRestoreDetune: /* 224 = restore detuning */
  4072.                         case eCmdRestoreEarlyLateAdjust: /* 240 = restore early/late adjust */
  4073.                         case eCmdRestoreDurationAdjust: /* 256 = restore duration adjust */
  4074.                         case eCmdRestoreSurroundPosition: /* 304 = restore surround position */
  4075.                             break;
  4076.  
  4077.                         /*   4-byte little endian large/extended integer coded decimal */
  4078.                         case eCmdSetTempo: /* 17 = set tempo */
  4079.                         case eCmdIncTempo: /* 18 = adjust tempo */
  4080.                         case eCmdSetStereoPosition: /* 33 = set stereo position */
  4081.                         case eCmdIncStereoPosition: /* 34 = adjust stereo position */
  4082.                         case eCmdSetVolume: /* 49 = set volume */
  4083.                         case eCmdIncVolume: /* 50 = adjust volume */
  4084.                         case eCmdSetReleasePoint1: /* 65 = set release point 1 */
  4085.                         case eCmdIncReleasePoint1: /* 66 = adjust release point 1 */
  4086.                         case eCmdSetReleasePoint2: /* 81 = set release point 2 */
  4087.                         case eCmdIncReleasePoint2: /* 82 = adjust release point 2 */
  4088.                         case eCmdSetAccent1: /* 97 = set accent 1 */
  4089.                         case eCmdIncAccent1: /* 98 = adjust accent 1 */
  4090.                         case eCmdSetAccent2: /* 113 = set accent 2 */
  4091.                         case eCmdIncAccent2: /* 114 = adjust accent 2 */
  4092.                         case eCmdSetAccent3: /* 129 = set accent 3 */
  4093.                         case eCmdIncAccent3: /* 130 = adjust accent 3 */
  4094.                         case eCmdSetAccent4: /* 145 = set accent 4 */
  4095.                         case eCmdIncAccent4: /* 146 = adjust accent 4 */
  4096.                         case eCmdSetPitchDispDepth: /* 161 = set pitch displacement depth */
  4097.                         case eCmdIncPitchDispDepth: /* 162 = adjust pitch displacement depth */
  4098.                         case eCmdSetPitchDispRate: /* 177 = set pitch displacement rate */
  4099.                         case eCmdIncPitchDispRate: /* 178 = adjust pitch displacement rate */
  4100.                         case eCmdSetPitchDispStart: /* 193 = set pitch displacement start point */
  4101.                         case eCmdIncPitchDispStart: /* 194 = adjust pitch displacement start point */
  4102.                         case eCmdSetHurryUp: /* 209 = set hurry-up factor */
  4103.                         case eCmdIncHurryUp: /* 210 = adjust hurry-up factor */
  4104.                         case eCmdSetDetune: /* 225 = set detuning */
  4105.                         case eCmdIncDetune: /* 226 = adjust detuning */
  4106.                         case eCmdSetEarlyLateAdjust: /* 241 = set early/late adjust */
  4107.                         case eCmdIncEarlyLateAdjust: /* 242 = adjust early/late adjust */
  4108.                         case eCmdSetDurationAdjust: /* 257 = set duration adjust */
  4109.                         case eCmdIncDurationAdjust: /* 258 = adjust duration adjust */
  4110.                         case eCmdSetMeasureNumber: /* 273 = set measure number */
  4111.                         case eCmdSetSurroundPosition: /* 305 = set surround position */
  4112.                         case eCmdIncSurroundPosition: /* 306 = adjust surround position */
  4113.                         case eCmdSetTranspose: /* 320 = set transpose */
  4114.                         case eCmdAdjustTranspose: /* 321 = adjust transpose */
  4115.                         case eCmdSetEffectParam1: /* 336 = set effect accent 1 */
  4116.                         case eCmdIncEffectParam1: /* 337 = adjust effect accent 1 */
  4117.                         case eCmdSetEffectParam2: /* 352 = set effect accent 2 */
  4118.                         case eCmdIncEffectParam2: /* 353 = adjust effect accent 2 */
  4119.                         case eCmdSetEffectParam3: /* 368 = set effect accent 3 */
  4120.                         case eCmdIncEffectParam3: /* 369 = adjust effect accent 3 */
  4121.                         case eCmdSetEffectParam4: /* 384 = set effect accent 4 */
  4122.                         case eCmdIncEffectParam4: /* 385 = adjust effect accent 4 */
  4123.                         case eCmdSetScoreEffectParam1: /* 400 = set global score effect accent 1 */
  4124.                         case eCmdIncScoreEffectParam1: /* 401 = adjust global score effect accent 1 */
  4125.                         case eCmdSetScoreEffectParam2: /* 416 = set global score effect accent 2 */
  4126.                         case eCmdIncScoreEffectParam2: /* 417 = adjust global score effect accent 2 */
  4127.                         case eCmdSetScoreEffectParam3: /* 432 = set global score effect accent 3 */
  4128.                         case eCmdIncScoreEffectParam3: /* 433 = adjust global score effect accent 3 */
  4129.                         case eCmdSetScoreEffectParam4: /* 448 = set global score effect accent 4 */
  4130.                         case eCmdIncScoreEffectParam4: /* 449 = adjust global score effect accent 4 */
  4131.                             if (!WriteBufferedSignedLongLittleEndian(Output,Note->a.Command.Argument1))
  4132.                                 {
  4133.                                     return eFileLoadDiskError;
  4134.                                 }
  4135.                             break;
  4136.  
  4137.                         /*   4-byte little endian large/extended integer coded decimal */
  4138.                         /*   4-byte little endian large/extended integer coded decimal */
  4139.                         case eCmdSweepTempoAbs: /* 19 = sweep tempo absolute */
  4140.                         case eCmdSweepTempoRel: /* 20 = sweep tempo relative */
  4141.                         case eCmdSweepStereoAbs: /* 35 = sweep stereo position absolute */
  4142.                         case eCmdSweepStereoRel: /* 36 = sweep stereo position relative */
  4143.                         case eCmdSweepVolumeAbs: /* 51 = sweep volume absolute */
  4144.                         case eCmdSweepVolumeRel: /* 52 = sweep volume relative */
  4145.                         case eCmdSweepReleaseAbs1: /* 68 = sweep release point 1 absolute */
  4146.                         case eCmdSweepReleaseRel1: /* 69 = sweep release point 1 relative */
  4147.                         case eCmdSweepReleaseAbs2: /* 84 = sweep release point 2 absolute */
  4148.                         case eCmdSweepReleaseRel2: /* 85 = sweep release point 2 relative */
  4149.                         case eCmdSweepAccentAbs1: /* 99 = sweep accent 1 absolute */
  4150.                         case eCmdSweepAccentRel1: /* 100 = sweep accent 1 relative */
  4151.                         case eCmdSweepAccentAbs2: /* 115 = sweep accent 2 absolute */
  4152.                         case eCmdSweepAccentRel2: /* 116 = sweep accent 2 relative */
  4153.                         case eCmdSweepAccentAbs3: /* 131 = sweep accent 3 absolute */
  4154.                         case eCmdSweepAccentRel3: /* 132 = sweep accent 3 relative */
  4155.                         case eCmdSweepAccentAbs4: /* 147 = sweep accent 4 absolute */
  4156.                         case eCmdSweepAccentRel4: /* 148 = sweep accent 4 relative */
  4157.                         case eCmdSweepPitchDispDepthAbs: /* 164 = sweep pitch displacement depth absolute */
  4158.                         case eCmdSweepPitchDispDepthRel: /* 165 = sweep pitch displacement depth relative */
  4159.                         case eCmdSweepPitchDispRateAbs: /* 179 = sweep pitch displacement rate absolute */
  4160.                         case eCmdSweepPitchDispRateRel: /* 180 = sweep pitch displacement rate relative */
  4161.                         case eCmdSweepPitchDispStartAbs: /* 196 = sweep pitch displacement start point absolute */
  4162.                         case eCmdSweepPitchDispStartRel: /* 197 = sweep pitch displacement start point relative */
  4163.                         case eCmdSweepHurryUpAbs: /* 211 = sweep hurry-up factor absolute */
  4164.                         case eCmdSweepHurryUpRel: /* 212 = sweep hurry-up factor relative */
  4165.                         case eCmdSweepDetuneAbs: /* 228 = sweep detuning absolute */
  4166.                         case eCmdSweepDetuneRel: /* 229 = sweep detuning relative */
  4167.                         case eCmdSweepEarlyLateAbs: /* 243 = sweep early/late adjust absolute */
  4168.                         case eCmdSweepEarlyLateRel: /* 244 = sweep early/late adjust relative */
  4169.                         case eCmdSweepDurationAbs: /* 259 = sweep duration adjust absolute */
  4170.                         case eCmdSweepDurationRel: /* 260 = sweep duration adjust relative */
  4171.                         case eCmdSetMeter: /* 272 = set meter */
  4172.                         case eCmdSweepSurroundAbs: /* 307 = sweep surround position absolute */
  4173.                         case eCmdSweepSurroundRel: /* 308 = sweep surround position relative */
  4174.                         case eCmdSweepEffectParamAbs1: /* 338 = sweep effect accent 1 absolute */
  4175.                         case eCmdSweepEffectParamRel1: /* 339 = sweep effect accent 1 relative */
  4176.                         case eCmdSweepEffectParamAbs2: /* 354 = sweep effect accent 2 absolute */
  4177.                         case eCmdSweepEffectParamRel2: /* 355 = sweep effect accent 2 relative */
  4178.                         case eCmdSweepEffectParamAbs3: /* 370 = sweep effect accent 3 absolute */
  4179.                         case eCmdSweepEffectParamRel3: /* 371 = sweep effect accent 3 relative */
  4180.                         case eCmdSweepEffectParamAbs4: /* 386 = sweep effect accent 4 absolute */
  4181.                         case eCmdSweepEffectParamRel4: /* 387 = sweep effect accent 4 relative */
  4182.                         case eCmdSweepScoreEffectParamAbs1: /* 402 = sweep global score effect accent 1 absolute */
  4183.                         case eCmdSweepScoreEffectParamRel1: /* 403 = sweep global score effect accent 1 relative */
  4184.                         case eCmdSweepScoreEffectParamAbs2: /* 418 = sweep global score effect accent 2 absolute */
  4185.                         case eCmdSweepScoreEffectParamRel2: /* 419 = sweep global score effect accent 2 relative */
  4186.                         case eCmdSweepScoreEffectParamAbs3: /* 434 = sweep global score effect accent 3 absolute */
  4187.                         case eCmdSweepScoreEffectParamRel3: /* 435 = sweep global score effect accent 3 relative */
  4188.                         case eCmdSweepScoreEffectParamAbs4: /* 450 = sweep global score effect accent 4 absolute */
  4189.                         case eCmdSweepScoreEffectParamRel4: /* 451 = sweep global score effect accent 4 relative */
  4190.                             if (!WriteBufferedSignedLongLittleEndian(Output,Note->a.Command.Argument1))
  4191.                                 {
  4192.                                     return eFileLoadDiskError;
  4193.                                 }
  4194.                             if (!WriteBufferedSignedLongLittleEndian(Output,Note->a.Command.Argument2))
  4195.                                 {
  4196.                                     return eFileLoadDiskError;
  4197.                                 }
  4198.                             break;
  4199.  
  4200.                         /*   1-byte origin specifier */
  4201.                         /*       -1 = 0 */
  4202.                         /*       0 = 1 */
  4203.                         case eCmdReleasePointOrigin1: /* 67 = set release point 1 origin */
  4204.                         case eCmdReleasePointOrigin2: /* 83 = set release point 2 origin */
  4205.                         case eCmdPitchDispStartOrigin: /* 195 = set pitch displacement start point origin */
  4206.                         case eCmdDetuneMode: /* 227 = set detuning mode */
  4207.                         case eCmdDurationAdjustMode: /* 261 = set duration adjust mode */
  4208.                         case eCmdTrackEffectEnable: /* 464 = track effects switch */
  4209.                             if (!WriteBufferedUnsignedChar(Output,
  4210.                                 (Note->a.Command.Argument1 < 0) ? 0 : 1))
  4211.                                 {
  4212.                                     return eFileLoadDiskError;
  4213.                                 }
  4214.                             break;
  4215.  
  4216.                         /*   4-byte little endian length of comment text string */
  4217.                         /*   n-byte comment text string (line feed = 0x0a) */
  4218.                         case eCmdMarker: /* 288 = comment */
  4219.                             if (!WriteBufferedSignedLongLittleEndian(Output,
  4220.                                 PtrSize(Note->a.Command.StringArgument)))
  4221.                                 {
  4222.                                     return eFileLoadDiskError;
  4223.                                 }
  4224.                             if (!WriteBufferedOutput(Output,PtrSize(Note->a.Command.StringArgument),
  4225.                                 Note->a.Command.StringArgument))
  4226.                                 {
  4227.                                     return eFileLoadDiskError;
  4228.                                 }
  4229.                             break;
  4230.                     }
  4231.             }
  4232.  
  4233.         return eFileLoadNoError;
  4234.     }
  4235.  
  4236.  
  4237. /* make a complete copy of the note/command and any blocks it has allocated */
  4238. NoteObjectRec*                DeepCopyNoteObject(NoteObjectRec* Note)
  4239.     {
  4240.         NoteObjectRec*            Copy;
  4241.  
  4242.         CheckPtrExistence(Note);
  4243.  
  4244.         /* duplicate */
  4245.         Copy = (NoteObjectRec*)AllocPtrCanFail(sizeof(NoteObjectRec),"NoteObjectRec");
  4246.         if (Copy == NIL)
  4247.             {
  4248.                 return NIL;
  4249.             }
  4250.  
  4251.         /* copy data over */
  4252.         Copy->Flags = Note->Flags;
  4253.         if ((Note->Flags & eCommandFlag) != 0)
  4254.             {
  4255.                 /* command */
  4256.                 Copy->a.Command.Argument1 = Note->a.Command.Argument1;
  4257.                 Copy->a.Command.Argument2 = Note->a.Command.Argument2;
  4258.                 Copy->a.Command.Argument3 = Note->a.Command.Argument3;
  4259.                 Copy->a.Command.StringArgument = CopyPtr(Note->a.Command.StringArgument);
  4260.                 if (Copy->a.Command.StringArgument == NIL)
  4261.                     {
  4262.                         ReleasePtr((char*)Copy);
  4263.                         return NIL;
  4264.                     }
  4265.                 SetTag(Copy->a.Command.StringArgument,"NoteObjectRec: StringArgument");
  4266.             }
  4267.          else
  4268.             {
  4269.                 /* note */
  4270.                 Copy->a.Note.Pitch = Note->a.Note.Pitch;
  4271.                 Copy->a.Note.PortamentoDuration = Note->a.Note.PortamentoDuration;
  4272.                 Copy->a.Note.EarlyLateAdjust = Note->a.Note.EarlyLateAdjust;
  4273.                 Copy->a.Note.DurationAdjust = Note->a.Note.DurationAdjust;
  4274.                 Copy->a.Note.Tie = Note->a.Note.Tie;
  4275.                 Copy->a.Note.ReleasePoint1 = Note->a.Note.ReleasePoint1;
  4276.                 Copy->a.Note.ReleasePoint2 = Note->a.Note.ReleasePoint2;
  4277.                 Copy->a.Note.OverallLoudnessAdjustment = Note->a.Note.OverallLoudnessAdjustment;
  4278.                 Copy->a.Note.StereoPositionAdjustment = Note->a.Note.StereoPositionAdjustment;
  4279.                 Copy->a.Note.SurroundPositionAdjustment = Note->a.Note.SurroundPositionAdjustment;
  4280.                 Copy->a.Note.Accent1 = Note->a.Note.Accent1;
  4281.                 Copy->a.Note.Accent2 = Note->a.Note.Accent2;
  4282.                 Copy->a.Note.Accent3 = Note->a.Note.Accent3;
  4283.                 Copy->a.Note.Accent4 = Note->a.Note.Accent4;
  4284.                 Copy->a.Note.MultisamplePitchAsIf = Note->a.Note.MultisamplePitchAsIf;
  4285.                 Copy->a.Note.PitchDisplacementDepthAdjustment = Note->a.Note.PitchDisplacementDepthAdjustment;
  4286.                 Copy->a.Note.PitchDisplacementRateAdjustment = Note->a.Note.PitchDisplacementRateAdjustment;
  4287.                 Copy->a.Note.PitchDisplacementStartPoint = Note->a.Note.PitchDisplacementStartPoint;
  4288.                 Copy->a.Note.HurryUpFactor = Note->a.Note.HurryUpFactor;
  4289.                 Copy->a.Note.Detuning = Note->a.Note.Detuning;
  4290.             }
  4291.  
  4292.         return Copy;
  4293.     }
  4294.